首页 文章

时间戳由公式触发的Google脚本

提问于
浏览
0

我将使用此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 回答

  • 1

    重构代码,以便通过独立函数完成时间戳的编写 . 然后通过 onEdit() 以及其他触发器调用该函数 .

    function addTimestamp(range) {
      // add the timestamp
    }
    
    function onEdit(event) {
      // does something
      addTimestamp(range);
    }
    
    function yourOtherTrigger() {
      // does something
      addTimestamp(range);
    }
    

    您还应该查看event object documentation . 您对 event 的使用效率不高(尤其是 event.source.getSheetByName(activeSheetName())event.source.getActiveRange() ) .

  • 0

    公式无法激活简单或可安装的触发器 . 要解决这个问题,你必须重新考虑你的解决方案,

    也许不是逐个“读取”更改,而是通过编辑多个单元格范围来读取更改,例如用户粘贴数据或进行填充时 .

    或者您可能应该设计一种方法来捕获要输入的数据和时间戳 .

    对于某些用例,最简单的解决方案是将Google表单用于其他应创建Web应用程序的应用程序 .

    参考

    有关

相关问题