谷歌脚本运行,但获得“无权调用setValues”作为函数返回

时间:2018-02-06 14:20:11

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

在google工作表中,我试图将结果数组返回到具有单个自定义函数的单元格数组。很像“= IMPORT ...”或“= QUERY”原生函数。感谢用户Bardy和此original post,我开发了以下脚本。

function asset() {  
  var s = SpreadsheetApp.getActiveSpreadsheet()
  var ss = s.getActiveSheet()
  var sc = ss.getActiveCell()
  var items = [{Description:'Well',ItemId:'1'},
{Description:'House',ItemId:'2'}];

  var outputRows = []
  var headings = ["Description","ItemId"]

  items.forEach(function(item){
    outputRows.push(headings.map(function(heading){
      return item[heading] || '';
     }));
  });

  if (outputRows.length){
    outputRows.unshift(headings);
SpreadsheetApp.getActiveSheet().getRange(1,1,outputRows.length,outputRows[0].length).setValues(outputRows);
  }
}

当我运行它时,脚本就像一个魅力,但如果我尝试从电子表格调用该函数,我会得到恶意

'错误:您无权调用setValues(第18行)。'

我已经扫描了博客,并检查了几乎所有的帮助文件,并且有些东西没有连接。我认为它与我尝试激活细胞的方式有关,但我缺少什么?

注意我知道类似的帖子,如"No Permission to call setValues() - Google Apps Script, JSON data [duplicate]" (标记为"No permission to call msgBox in Google Apps Scripting "的复制品),但我相信我的应用程序有点不同。我试图允许最终用户根据输入的公式的位置将结果放在工作表中的任何位置。

我认为这与我尝试激活细胞的方式有关。我似乎无法弄清楚如何使其相对于输入的公式的位置。我错过了什么?

1 个答案:

答案 0 :(得分:2)

从脚本编辑器运行该功能时,可以使用函数.setValues()。但是,将该函数用作自定义函数时,只能将值设置为具有自定义函数的单元格或其相邻单元格。 Ruben的这个answer几乎总结了在使用自定义函数时如何设置值。

同样在您的情况下,您只需返回数组,而不是使用setValues()。 像这样:

function asset() {  
  var s = SpreadsheetApp.getActiveSpreadsheet()
  var ss = s.getActiveSheet()
  var sc = ss.getActiveCell()
  var items = [{Description:'Well',ItemId:'1'},
{Description:'House',ItemId:'2'}];

  var outputRows = []
  var headings = ["Description","ItemId"]

  items.forEach(function(item){
    outputRows.push(headings.map(function(heading){
      return item[heading] || '';
     }));
  });

  if (outputRows.length){
    outputRows.unshift(headings);
    return outputRows
  }
}