我将使用此Google脚本在更新设置列中的单元格后,在我的Google表格列中获取时间戳:
`function activeSheetName() {
return
SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName();
}
function onEdit(event)
{
var timezone = "GMT+9";
var timestamp_format = "MM-dd-yyyy"; // Timestamp Format.
var updateColName = "Profit";
var timeStampColName = "Time";
var sheet = event.source.getSheetByName(activeSheetName()); //Name of the sheet where you want to run this script.
var actRng = event.source.getActiveRange();
var editColumn = actRng.getColumn();
var index = actRng.getRowIndex();
var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues();
var dateCol = headers[0].indexOf(timeStampColName);
var updateCol = headers[0].indexOf(updateColName); updateCol = updateCol+1;
if (dateCol > -1 && index > 1 && editColumn == updateCol) { // only timestamp if 'Last Updated' header exists, but not in the header row itself!
var cell = sheet.getRange(index, dateCol + 1);
var date = Utilities.formatDate(new Date(), timezone, timestamp_format);
cell.setValue(date);
}
}`
当我手动更改触发器列中的值时,该脚本可以正常工作 . 但是,我在触发器列中使用了一个基于“触发器”的公式,它会在更改/更新时自动更新触发器列 . 问题是此脚本不会响应列中填充的触发数据,只会手动输入值 . 我怎么能绕过这个?
2 回答
重构代码,以便通过独立函数完成时间戳的编写 . 然后通过
onEdit()
以及其他触发器调用该函数 .您还应该查看event object documentation . 您对
event
的使用效率不高(尤其是event.source.getSheetByName(activeSheetName())
和event.source.getActiveRange()
) .公式无法激活简单或可安装的触发器 . 要解决这个问题,你必须重新考虑你的解决方案,
也许不是逐个“读取”更改,而是通过编辑多个单元格范围来读取更改,例如用户粘贴数据或进行填充时 .
或者您可能应该设计一种方法来捕获要输入的数据和时间戳 .
对于某些用例,最简单的解决方案是将Google表单用于其他应创建Web应用程序的应用程序 .
参考
Simple Triggers
Installable Triggers
有关
onEdit script not firing on Google Sheet in formula based cells
Formula-based cell changes in Google Sheets is not firing onEdit script