【问题标题】:Google Apps Script - Spreadsheet run script onEdit?Google Apps 脚本 - 电子表格运行脚本 onEdit?
【发布时间】:2013-04-04 22:49:38
【问题描述】:

我有一个在电子表格中使用的脚本。它位于单元格 B2 中,它需要像 =myfunction(A2:A12) 这样的参数。该函数在内部从大量单元格中获取信息。

似乎没有任何效果。我尝试将其添加到
脚本 > 资源 > 当前项目触发器 > 编辑时
脚本 > 资源 > 当前项目触发器 > 打开时

如何让这个函数在每次文档编辑时更新结果?

【问题讨论】:

  • “似乎没有任何效果”显然是夸大其词。什么具体不起作用?例如,触发器将事件作为参数传递,因此期望范围(如您所示)的自定义函数将无法获取它。
  • 该函数在电子表格的单元格中使用,并在该单元格中显示返回的结果。我希望该功能能够更新文档编辑时的单元格结果。

标签: google-apps-script google-docs google-drive-api


【解决方案1】:

当您在自定义函数(如 getRange 和 getValues 等)中调用 Google Apps 服务时,很遗憾,除了传递 all您正在“观察”以进行编辑的单元格。

而且,也许更令人沮丧的是,传递的解决方法是说一个使用公式引用所有“监视”单元格的单元格不会触发更新 - 似乎需要直接引用“被监视”的单元格。

您可以将 GoogleClock() 作为参数传递,至少每分钟更新一次函数输出。

但是这个论坛上的许多成员(他们对这方面的知识比我多得多)的建议很简单:“不要使用自定义函数”。

【讨论】:

    【解决方案2】:

    我不确定这个确切的代码是否有效,但你可以尝试这样的事情......

    function onEdit(event){
      var activeSheet = event.source.getActiveSheet();
      if(activeSheet.getName() == "ActiveSheetName") {
        var targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("TargetSheetName");
        targetSheet.getRange(2,2).setValue("=myfunction(A2:A12)");
      }
    }
    

    假设 B2 单元格在工作表“TargetSheetName”上,并且假设编辑的单元格在工作表“ActiveSheetName”上,当您编辑任何工作表中的任何单元格时,onEdit 函数将触发。由于有一个 if 语句来检查该编辑的单元格是否在工作表“ActiveSheetName”上,因此只有当编辑的单元格在该工作表上时才会触发,并且它将 B”单元格设置为值 =myfunction(A2:A12),强迫它更新(我猜)。

    希望我是正确的,我是有帮助的

    【讨论】:

      【解决方案3】:

      我有一个类似的问题,我想“观察”一个特定的单元格来触发我的功能。

      我做了以下事情(假装 A1 是我正在观看的单元格)

      IF(LEN(A1) < 1, " ", customFunction() )
      

      如果我曾经编辑过该单元格,则会成功触发。然而:

      "自定义函数返回值,但不能在外部设置值 它们所在的单元格。在大多数情况下,自定义函数 单元格 A1 无法修改单元格 A5。但是,如果自定义函数返回 双数组,结果溢出包含函数的单元格 并填充下面和右侧的单元格,其中包含 自定义功能。您可以使用包含 返回 [[1,2],[3,4]];." 来自:https://developers.google.com/apps-script/execution_custom_functions

      这使它几乎没用,但它可能适用于您的情况?

      如果将自定义函数分配给项目触发器,则它具有更大的功能,因此我个人最终将其添加到“脚本>资源>当前项目触发器>编辑时”

      并且基本上是“观看一列”,因此它仅在当前单元格在“编辑范围”内时才执行操作。这有点麻烦,需要一些隐藏的单元格,但目前它对我有用

        var rowIndex = thisspreadsheet.getActiveCell().getRowIndex();
        var colIndex = thisspreadsheet.getActiveCell().getColumn();
        //clamp to custom range
        if(rowIndex < 3 && colIndex != 5)
        {
            return 0; 
        }
      
        //check against copy
        var name = SpreadsheetApp.getActiveSheet().getRange(rowIndex, 5).getValue();
        var copy = SpreadsheetApp.getActiveSheet().getRange(rowIndex, 6).getValue();
        if(name != copy )
        {
           ///value has been changed, do stuff
           SpreadsheetApp.getActiveSheet().getRange(rowIndex, 6).setValue(name);
        }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 2021-04-21
        • 2023-03-25
        相关资源
        最近更新 更多