Google Script setValue权限

时间:2013-04-10 17:57:32

标签: google-apps-script google-sheets permissions custom-function

我正在尝试为google docs电子表格中的单元格设置一些值。

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;
}

如果我试图影响具有此功能的单元格,则会出现此错误:

  

您没有setValue所需的权限。 (第10行,档案   “DDD”)

你知道我怎么能做到这一点吗?我实际上希望受影响的单元格获取单元格A1的值并增加A1 +1的值。

谢谢

4 个答案:

答案 0 :(得分:22)

来自文档:

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

的自定义函数对此进行测试

参考:Custom Functions in Spreadsheets

答案 1 :(得分:3)

看起来您正在使用上述功能作为自定义功能,换句话说,它通过Google表格UI上的单元格公式调用,方式如下:

=exampleFunction()

Custom functions in Google Sheets有一些限制,例如它们无法用于调用需要权限的Google Apps脚本服务。解决方法是使用另一个方法来调用函数:

也可以从dialogs and sidebarsGoogle Apps Script Web apps和使用Google Apps Script execution API

调用它们

答案 2 :(得分: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. 打开脚本编辑器:
    Script Editor

  2. 然后从左侧面板转到触发器并点击添加触发器按钮:
    Triggers item in the left side panel Triggers page

  3. 最后,创建触发器,从列表中选择您的宏(我的是SetFormula),选择事件源作为来自电子表格 strong>,并且 Event Type 等于 On Edit 并保存它。 Create a new trigger

就是这样!
注意:为了更加灵活,我将范围命名为 FormulaTexttotal
你可以从这里做到这一点:
Naming a range

答案 3 :(得分:0)

自定义功能确实具有如上所述的权限限制。它们可以与自定义菜单一起运行,也可以插入图像并为其分配自定义脚本以像按钮一样使用它。

使用Trigger是完成此示例的另一种方法,这使其自动完成。

应用脚本(例如set_J = range(nStops, 1) # nStop is the number of cities and set_J is the related set. trips = LpVariable.dicts(name="trips", indexs=set_I, lowBound=0, upBound=1, cat=LpInteger) # trips is the decision variable prob = LpProblem("TSP_MIP", LpMinimize) # Model definition prob += lpSum(dist[i]*trips[i] for i in set_I) # Objective function prob += lpSum(trips[i] for i in set_I) == nStops, "" # Constraint 1 # Constraint 2: for j in set_J: prob += lpSum(trips[whichIdxs[i, j]] for i in set_I) == 2, "" prob.solve() )中的简单触发器可以正常工作,而不会遇到将自定义函数放入单元格的权限问题。此触发器比原始帖子中的触发器要新。在下面的简单示例中,单元格A1将变为带有偶数整数的白色,变为带有其他任何值的红色。当然,扳机发射的速度可能会有所不同。它并不总是像人们期望的那样瞬时。

onSelectionChange(e)