2

我正在使用一个自定义函数来跟踪单元格的颜色。但是有一个问题是,如果单元格颜色发生变化,这个函数不会自行更新。

单元格颜色:

function GetCellColorCode(input) 
{ 
var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var cell = ss.getRange(input); 
var result = cell.getBackground(); 
return result 
}

接下来,我找到并添加了一个脚本,该脚本重新计算表中的所有公式,以便它们自行更新。我添加了触发器,以便该公式每小时运行一次。

function refresh() {SpreadsheetApp.flush()}

但我的表格有17 页数千个公式。结果,所有内容的更新速度都比我想要的慢得多。

我的问题是:我可以在自定义公式中添加一些内容,以便它像常规的 google 表格公式一样工作,并且如果单元格中发生更改会立即更改?

4

2 回答 2

3

我相信你的目标如下。

  • 当单元格的背景颜色改变时,您想刷新自定义函数。

修改点:

  • 当单元格的背景颜色发生变化时,可以通过 OnChange 触发器检测到。我认为这可能可以用于实现您的目标。

  • 为了实现您的目标,我想提出以下流程。

    1. 首先,作为示例,将自定义公式=GetCellColorCode("A1")放在单元格“B1”中。
    2. 当单元格“A1”的背景颜色改变时,OnChange 触发器运行一个函数。
    3. OnChange 触发器运行的函数刷新GetCellColorCode.
      • 在这种情况下,使用 TextFinder。

通过这个流程,GetCellColorCode可以刷新自定义功能。

用法:

要使用此方法,请执行以下流程。

1. 准备脚本。

请将以下脚本复制并粘贴到电子表格的脚本编辑器中并保存。

// I added this script.
function onChange(e) {
  if (e.changeType == "FORMAT") {
    var formula = "=GetCellColorCode";
    var tempFormula = "=sample";
    var sheet = e.source.getActiveSheet();
    sheet.createTextFinder(`^\\${formula}`).matchFormulaText(true).useRegularExpression(true).replaceAllWith(tempFormula);
    sheet.createTextFinder(`^\\${tempFormula}`).matchFormulaText(true).useRegularExpression(true).replaceAllWith(formula);
  }
}

// This is your script.
function GetCellColorCode(input) { 
  var ss = SpreadsheetApp.getActiveSpreadsheet(); 
  var cell = ss.getRange(input); 
  var result = cell.getBackground(); 
  return result 
}
  • 在此示例中,背景单元格更改的活动工作表中的 cusrom 公式GetCellColorCode被刷新。

2. 安装 OnChange 触发器以onChange运行。

请将 OnChange 触发器安装到onChange. 参考

3.设置自定义公式。

请将自定义公式=GetCellColorCode("A1")放在单元格“B1”中。在这种情况下,当单元格“A1”具有默认背景颜色时,#ffffff将显示在自定义函数的单元格“B1”中。

4. 测试脚本。

请更改“A1”的背景颜色。这样,函数onChange由 OnChange 触发器运行。并且,自定义函数被刷新,然后,单元格“B1”的值被改变。

作为演示,当使用上述流程时,得到以下结果。

在此处输入图像描述

笔记:

  • 在此示例中,它假设您的自定义函数的函数名称是GetCellColorCode. 所以当你修改它时,请同时修改上面的示例脚本。请注意这一点。

参考:

于 2021-01-17T02:46:48.450 回答
0

我的猜测是您不能在自定义函数中使用 SpreadsheetApp.flush() 阅读此处的指南。

于 2021-01-16T23:19:55.790 回答