在Google工作表脚本中,我正在尝试将工作表A中的一个单元格中的值复制到工作表B中的另一个单元格。
问题是,当我在google sheet脚本编辑器中启动avgUtilisationPerWeek()函数时,代码正在执行该任务,它会根据定义设置单元格的值。
但是当我使用formula = avgUtilisationPerWeek()从目标表调用函数时,它会报告#ERROR“您无权调用setValue(第108行)。”
在自定义函数中,我正在尝试设置工作表中其他单元格的值,而不仅仅是放置公式的单元格。
这是源代码:
function avgUtilisationPerWeek(){
for(var i = 1; i < 14; i++) {
Utilities.sleep(3000);
SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Dynamic Weekly Utilisation Report').getRange('D1').setValue(i);
t1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Dynamic Weekly Utilisation Report').getRange('L4').getValue();
SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Graph Q1 2017').getRange((String.fromCharCode('A'.charCodeAt(0) + i)).concat('24')).setValue(t1);
v = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Dynamic Weekly Utilisation Report').getRange('L5').getValue();
SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Graph Q1 2017').getRange((String.fromCharCode('A'.charCodeAt(0) + i)).concat('29')).setValue(v);
g = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Dynamic Weekly Utilisation Report').getRange('L6').getValue();
SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Graph Q1 2017').getRange((String.fromCharCode('A'.charCodeAt(0) + i)).concat('34')).setValue(g);
t2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Dynamic Weekly Utilisation Report').getRange('L7').getValue();
SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Graph Q1 2017').getRange((String.fromCharCode('A'.charCodeAt(0) + i)).concat('39')).setValue(t2);
}
}
我读过这篇文章,但没有找到解决方案。
答案 0 :(得分:0)
我认为你不能从表单中启动它 - 除非我错了。应该对你有用的是在onOpen()上创建一个单独的函数来获得一个自定义菜单,它允许你直接从工作表中运行你的函数。以下是否适合您?
详细说明如下:
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Custom Functions')
.addItem('Copy Function', 'avgUtilisationPerWeek')
.addToUi();
SpreadsheetApp.flush();
}
您的代码如下所示,但我为了自己的可视化目的而稍微清理了一下,可以选择这样做。
function avgUtilisationPerWeek(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet1 = ss.getSheetByName('Dynamic Weekly Utilisation Report');
var sheet2 = ss.getSheetByName('Graph Q1 2017');
for(var i = 1; i < 14; i++) {
Utilities.sleep(3000);
sheet1.getRange('D1').setValue(i);
t1 = sheet1.getRange('L4').getValue();
sheet2.getRange((String.fromCharCode('A'.charCodeAt(0) + i)).concat('24')).setValue(t1);
v = sheet1.getRange('L5').getValue();
sheet2.getRange((String.fromCharCode('A'.charCodeAt(0) + i)).concat('29')).setValue(v);
g = sheet1.getRange('L6').getValue();
sheet2.getRange((String.fromCharCode('A'.charCodeAt(0) + i)).concat('34')).setValue(g);
t2 = sheet1.getRange('L7').getValue();
sheet2.getRange((String.fromCharCode('A'.charCodeAt(0) + i)).concat('39')).setValue(t2);
}
}
答案 1 :(得分:0)
Google's guidelines关于在工作表中使用公式的具体说明:
只读(可以使用大多数get *()方法,但不能使用set *())。 无法打开其他电子表格(SpreadsheetApp.openById()或SpreadsheetApp.openByUrl())。
和:
如果您的自定义函数抛出错误消息“您没有调用X服务的权限。”,则该服务需要用户授权,因此无法在自定义函数中使用。
要使用除上面列出的服务以外的其他服务,请创建一个运行Apps脚本功能的自定义菜单,而不是编写一个自定义功能。通过菜单触发的功能将在必要时询问用户授权,因此可以使用所有Apps Script服务。
因此,按照David的建议,您应该使用自定义菜单,而不是公式。