Google表格脚本单元格值设置

时间:2017-05-10 07:37:33

标签: google-sheets setvalue

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

我读过这篇文章,但没有找到解决方案。

Google Script setValue permission

Transferring cell data in Google Script?

2 个答案:

答案 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的建议,您应该使用自定义菜单,而不是公式。