当单元格值通过API调用而不是用户手动进行更改时,如何触发脚本?

时间:2017-04-20 12:39:03

标签: google-apps-script

我正在使用Temboo来更新带有Arduino传感器数据的Google表格。我使用脚本为每个数据条目添加时间和日期戳,但由于数据未手动输入,我无法使用onEdit()触发器。我也试过创建一个onChange()触发器,如下所示,没有任何运气(触发参数是Run:onChange,事件:来自更改时的电子表格)。有没有可安装的触发器,有没有办法做到这一点?

function onChange(e){
  var timezone = "GMT+8";
  var date_format = "MM/dd/yyyy";
  var time_format = "hh:mm:ss";

  var updateColName = "sensor";

  var DateColName = "date";
  var TimeColName = "time";

  // update time and date if the sheet is updated via an api call 
  if (e.changeType == "OTHER") { 

      var sheet = event.source.getSheetByName('Sheet1'); //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(DateColName);
      var timeCol = headers[0].indexOf(TimeColName);

      var updateCol = headers[0].indexOf(updateColName);
      updateCol = updateCol + 1;

      if (dateCol > -1 && timeCol > -1 && index > 1 && editColumn == updateCol) {
        // only timestamp if 'Last Updated' header exists, but not in the header row itself! 

        var cellDate = sheet.getRange(index, dateCol + 1);
        var cellTime = sheet.getRange(index, timeCol + 1);

        var date = Utilities.formatDate(new Date(), timezone, date_format);
        var time = Utilities.formatDate(new Date(), timezone, time_format);

        cellDate.setValue(date);
        cellTime.setValue(time);
    }

  }
};

提前致谢!

2 个答案:

答案 0 :(得分:0)

基于this answer,如果单元格被更改但用户没有更改,则看起来没有直接触发onEdit()的解决方案。我使用提到here的时间触发脚本实现了一种解决方法。

答案 1 :(得分:0)

不久前我遇到过类似的问题。 我尝试了一切,最终我得到了可安装的触发器onChange

 function onChange(e) {
var ss = SpreadsheetApp.getActive();
ScriptApp.newTrigger('name of the function you need to trigger')
.forSpreadsheet(ss)
.onChange()
.create();
}

您需要在插入上述代码后保存脚本并运行onChange函数一次以安装触发器。您可以通过打开"当前项目的触发器来验证它是否已安装" 希望这有帮助!