首页 > 解决方案 > 当外部源(firebase)更改单元格时,如何在谷歌表格中触发谷歌应用程序脚本?

问题描述

我正在尝试触发绑定到 Google 表格的 Google App 脚本。

来自 firebase 的数据被拉入应该触发脚本的工作表中。我目前正在使用 onEdit(e),它在我手动添加数据时有效,但在从 firebase 更新数据时无效。有什么方法可以设置触发器以在每次更改特定范围内的单元格值时运行该函数。

谢谢!

脚本

function onEdit(e) {
  var ss = SpreadsheetApp.getActive()
  var dumpingGround = ss.getSheetByName("Dumping Ground")
  var dataDump = ss.getSheetByName("Data Dump")
  var ddLastRow = dataDump.getLastRow() + 1
  var editCol = e.range.getColumn();
  var editRow = e.range.getRow();

  Logger.log("edit")
  /*Copy from dumping ground to data dump*/
  if ((editRow == 1 && editCol == 2) || (editRow == 1 && editCol == 3)){

    /*Set required range for data dump and dumping ground*/
    var ddRange = '\'Data Dump\'!A' +ddLastRow+ ':BF' + ddLastRow
    var dgCopyRange = '\'Dumping Ground\'!B1:BF1'
    
    /*Copy action*/
    ss.getRange('\'Dumping Ground\'!B1:BF1').copyTo(ss.getRange(ddRange), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);

    /*Check data dump row count and delete 1000 rows if necessary*/
    if(ddLastRow = 9999){
      dataDump.deleteRows(1, 1000);
    }
  }
};

标签: javascriptgoogle-apps-scriptgoogle-sheets

解决方案


来自 Apps 脚本文档

脚本执行和 API 请求不会导致触发器运行。例如,调用 Range.setValue() 编辑单元格不会导致电子表格的 onEdit 触发器运行。

我认为你最好但会创建一个时间触发器并检查指定范围内的变化。当然,我不能确定这是否适合您的目的,但值得一试。

以下是一些可供考虑的替代方案:

  • 如果数据拉取是由您的脚本启动的,那么只需让该函数完成所需的操作。
  • 如果您有一个单独的服务来填充数据,则可以使用 Sheets API。
  • 您可以将脚本发布为Web 应用程序并通过 GET 或 POST 触发
  • 您可以尝试使用Apps Script API执行函数。请查看这样做的要求,因为它可能不符合您的要求。

推荐阅读