谷歌应用程序脚本:来自单元格本身的 setNote()

tuk*_*irs 1 google-sheets google-apps-script custom-function

我想从一个单元格设置注释——注释应该设置为同一个单元格。

我试过这个功能

function setNote(note){
    var note = note;
    var cell = SpreadsheetApp.getActiveSheet().getActiveCell();

    if(note == ""){
        cell.clearNote();
    }else{
        cell.setNote(note);
    }
}
Run Code Online (Sandbox Code Playgroud)

但出现错误You do not have permission to call setNote (line 8),这很明显,因为我无法编辑任何带有“单元格函数”的单元格(在单元格中输入/键入的函数,而不是 GAS/JavaScript 函数本身)。

有没有办法从单元格本身设置注释(使用“单元格函数”)?

我希望能够从单元格内设置单元格值(我已经可以)注释(我还不能),例如 '=if(d4=4, e4, "") & setNote(b4 )` ......或类似的东西。

小智 5

实际上,没有。内置电子表格函数不会创建注释。创建笔记的两种方法是:手动和使用 Apps 脚本。自定义函数可以调用 Apps 脚本,但没有任何set*方法的授权。

也就是说,有一个疯狂的解决方法可能不值得付出努力。自定义函数可以使用UrlFetchApp以下方式发出 GET 请求:

function myFunction() {
  return UrlFetchApp.fetch("http://example.com").getContentText();
}
Run Code Online (Sandbox Code Playgroud)

作品。您可以将您的 Apps 脚本部署为 Web 应用程序,授权它以您的身份运行(因此需要您的授权),但互联网上的每个人都可以访问,即使是匿名的。将那个 Web 应用程序的 URL 放在上面的自定义函数中。传递注释的文本和要添加它的单元格。为了增加安全性,请将一些令牌作为 URL 参数传递,Web 应用程序将使用该参数来检查调用它的人是您。所以 URL 将以

?cell=B12&note=Hello%20World&token=mysecretpassword
Run Code Online (Sandbox Code Playgroud)

由于网络应用程序被授权以您的身份行事,它将能够打开电子表格并进行更改:

function doGet(e) {
  var cellAddress = e.parameter.cell;
  var note = e.parameter.note;
  var token = e.parameter.token;
  if (token == 'mysecretpassword') {
    var ss = SpreadsheetApp.openById('id_here');
    var sheet = ss.getSheetByName('Sheet1');
    var cell = sheet.getRange(cellAddress);
    cell.setNote(note);
  }
}
Run Code Online (Sandbox Code Playgroud)

为了使其更广泛地有用,电子表格 ID 和工作表名称也可以作为 URL 参数发送。

在这种方法的潜在问题中,例如执行缓慢,fetch一天内可以进行的调用数量也有限制(20000/天)。