Google apps script 如何为onEdit(e)函数设置更接近的范围?
我想在特定条件下为不同的列写一个时间戳。该函数应在一定范围内执行。我想用第13行作为标题行 这就是它的工作原理: 时间戳1 如果在第14行的第8列或第9列中编辑单元格,则应在同一行的第10列中写入定义的时间戳(“HH:MM:SS”) 时间戳2 如果在第14行的第16列中编辑单元格,则应在同一行的第18列中写入时间戳 为此,我使用下面的代码。不幸的是,这不起作用 如果我将范围扩展到整个表,在第一行中编写列标题(请参见:updateColName,timeStampColName),并按如下所示定义“Header”变量,那么代码就可以工作了Google apps script 如何为onEdit(e)函数设置更接近的范围?,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我想在特定条件下为不同的列写一个时间戳。该函数应在一定范围内执行。我想用第13行作为标题行 这就是它的工作原理: 时间戳1 如果在第14行的第8列或第9列中编辑单元格,则应在同一行的第10列中写入定义的时间戳(“HH:MM:SS”) 时间戳2 如果在第14行的第16列中编辑单元格,则应在同一行的第18列中写入时间戳 为此,我使用下面的代码。不幸的是,这不起作用 如果我将范围扩展到整个表,在第一行中编写列标题(请参见:updateColName,timeStampColName),并按如下所示定
var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues();
我做错了什么
链接到图纸行数减少的公共版本
我认为您以错误的方式声明标题:
var headers = sheet.getRange(13, 8).getValues();
这仅捕获单元格H13上的值(第13行,第8列)
如果要获取所有行值,应执行以下操作:
var headers = sheet.getRange(13, 1, 1, sheet.getLastColumn());
看起来你的函数有一些小错误 要修复它们,让我们执行以下操作:
var headers=sheet.getRange(13,8).getValues()
tovar headers=sheet.getRange(13,1,1,sheet.getLastColumn())代码>
Utilities.formatDate(新日期(),时区,时间戳_格式)
toUtilities.formatDate(现在,时区,时间戳_格式)代码>。无需创建新的Date()对象
e
事件对象检测当前更改。更改var actRng=SpreadsheetApp.getActiveRange()代码>至var actRng=e.range代码>
function onEdit(e)
{
var timezone = "GMT+2";
var timestamp_format = "HH:mm:ss";
var updateColName = "Watchlist";
var updateColName1 = "Letzte Prüfung";
var updateColName2 = "Entry Datum";
var timeStampColName = "Letzte Änderung";
var timeStampColName1 = "Letzte Änderung 2";
var now = new Date();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('Tickerprüfung');
var actRng = e.range;
var editColumn = actRng.getColumn()-1;
var index = actRng.getRowIndex();
Logger.log(actRng);
if (index>=13) {
var headers = sheet.getRange(13, 1, 1, sheet.getLastColumn()).getValues()[0];
var cell;
if (editColumn === headers.indexOf(updateColName) || editColumn === headers.indexOf(updateColName1)) {
//Checks if column I has been edited and then writes a timestamp to column K in the same line
//Checks if column J has been edited and then writes a timestamp to column K in the same line
cell = sheet.getRange(index, headers.indexOf(timeStampColName)+1);
} else if (editColumn == headers.indexOf(updateColName2)) {
//Checks if column Q has been edited and then writes a timestamp to column S in the same line
var cell = sheet.getRange(index, headers.indexOf(timeStampColName1)+1);
} else {
return;
}
cell.setValue(Utilities.formatDate(now, timezone, timestamp_format));
}
}
希望这有帮助 你能分享一下电子表格的截图吗?截图附在上面。谢谢,这很有效,但现在我有另一个问题。编辑标题行或标题行上方的单元格时,标题将被覆盖,并且上方的单元格也将被时间戳覆盖。如何确保标题行和标题行上方的范围安全?不幸的是,根据您建议的更改,我没有任何时间戳。可能是我做错了什么。我将根据您的建议添加编辑后的代码。Hello@Dpei,您必须在使用某些内容初始化值editColumn后进行if检查。将其放在
var editColumn=actRng.getColumn()之后代码>行。对不起,我弄错了。我误读了你的密码。我已经更新了我的建议以反映正确的解决方案。我更改了上面的代码,但是我仍然没有在我的目标列中获得任何时间戳。。。还有其他想法吗?@Dpei您可以创建一份电子表格的公开副本,并将其链接到您的问题中吗?这样我就可以复制你的问题并确定出问题所在。谢谢
var index = actRng.getRowIndex();
if (index>13) {
//rest of the code
}
function onEdit(e)
{
var timezone = "GMT+2";
var timestamp_format = "HH:mm:ss";
var updateColName = "Watchlist";
var updateColName1 = "Letzte Prüfung";
var updateColName2 = "Entry Datum";
var timeStampColName = "Letzte Änderung";
var timeStampColName1 = "Letzte Änderung 2";
var now = new Date();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('Tickerprüfung');
var actRng = e.range;
var editColumn = actRng.getColumn()-1;
var index = actRng.getRowIndex();
Logger.log(actRng);
if (index>=13) {
var headers = sheet.getRange(13, 1, 1, sheet.getLastColumn()).getValues()[0];
var cell;
if (editColumn === headers.indexOf(updateColName) || editColumn === headers.indexOf(updateColName1)) {
//Checks if column I has been edited and then writes a timestamp to column K in the same line
//Checks if column J has been edited and then writes a timestamp to column K in the same line
cell = sheet.getRange(index, headers.indexOf(timeStampColName)+1);
} else if (editColumn == headers.indexOf(updateColName2)) {
//Checks if column Q has been edited and then writes a timestamp to column S in the same line
var cell = sheet.getRange(index, headers.indexOf(timeStampColName1)+1);
} else {
return;
}
cell.setValue(Utilities.formatDate(now, timezone, timestamp_format));
}
}