29

我正在尝试为 Google 电子表格中的单元格设置一些值:

    function exampleFunction() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getSheets()[0];
      var range1 = sheet.getRange("A1");
      var value1 = range1.getValue();
      value1+=1;
      range1.setValue(2);
      return value1;
    }

如果我尝试使用此功能影响单元格,则会出现此错误:

您没有设置值所需的权限。(第 10 行,文件“ddd”)

你知道我怎么能让这成为可能吗?我实际上希望受影响的单元格取单元格 A1 的值并将 A1 的值增加 1。

4

4 回答 4

41

从文档:

自定义函数返回值,但它们不能在它们所在的单元格之外设置值。在大多数情况下,单元格 A1 中的自定义函数无法修改单元格 A5。但是,如果自定义函数返回双精度数组,则结果会溢出包含该函数的单元格并填充包含自定义函数的单元格下方和右侧的单元格。您可以使用包含 return [[1,2],[3,4]]; 的自定义函数对此进行测试。

参考:电子表格中的自定义函数

于 2013-04-10T20:58:51.003 回答
12

看起来您将上述函数用作自定义函数,换句话说,它是由 Google 表格 UI 上的单元格公式调用的,方式如下:

=exampleFunction()

Google 表格中的自定义函数有一些限制,例如它们不能用于调用需要权限的 Google Apps 脚本服务。解决方法是使用另一种方法来调用该函数:

也可以从对话框和侧边栏Google Apps Script Web 应用程序以及使用Google Apps Script execution API 调用它们

于 2017-10-31T16:52:08.877 回答
1

如上所述,自定义函数确实有权限限制。它们可以使用自定义菜单运行,或者您可以插入图像并为其分配自定义脚本以像按钮一样使用它。

使用触发器是完成类似此示例的另一种方法,这使其自动化。

App Script 中的一个简单触发器(例如)onSelectionChange(e)不会遇到将自定义函数放入单元格的权限问题。此触发器比原始帖子中的触发器更新。在下面的简单示例中,单元格 A1 将变成白色并带有偶数整数和红色其他任何东西。当然,触发器触发的速度可能会有所不同。它并不总是像人们期望的那样即时。

function onSelectionChange(e) {

  const sheet = SpreadsheetApp.getActive()
  var value1 = sheet.getRange("A1").getValue()
    if(value1 % 2 == 0) {
        sheet.getRange("A1").setBackground("#FFFFFF") //white
    } else {
        sheet.getRange("A1").setBackground("#FF0000") //red
    }
}
于 2020-09-03T21:21:59.453 回答
1

终于找到了设置公式的方法……
只是和我们程序员想的有点不一样。
您可以在宏中使用 SetFormula,但不能在 CustomFunction 中使用。
只需从中创建一个简单的宏Tools->Macros->Record Macro,然后打开脚本编辑器并将宏的代码更改为您的代码...
这是我的宏代码:

function SetFormula() {
  var spreadsheet = SpreadsheetApp.getActive();
  var formulaValue = spreadsheet.getRange('formulaText').getValue().toString();
  spreadsheet.getRange('total').setFormula(formulaValue);
  return formulaValue;
};

然后为了自动运行你的宏,(你可以手动运行Tools->Macros->YOUR-MACRO-NAME),只需创建一个触发器,如下所示:

  1. 打开脚本编辑器:
    脚本编辑器

  2. 然后从左侧面板转到触发器并点击添加触发器按钮:
    触发左侧面板中的项目 触发器页面

  3. 最后,创建触发器,从列表中选择您的宏(我的是SetFormula),选择Event Source作为From SpreadSheet,并且Event Type等于On Edit并保存。 创建新触发器

就是这样!
注意:我将我的范围命名为FormulaTexttotal更灵活。
你可以从这里做到这一点:
命名范围

于 2021-02-08T18:51:32.923 回答