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

google apps script: setNote() from the cell itself

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

我试过这个功能

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

    if(note == ""){
        cell.clearNote();
    }else{
        cell.setNote(note);
    }
}

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

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

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

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

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

function myFunction() {
  return UrlFetchApp.fetch("http://example.com").getContentText();
}

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

结尾
?cell=B12&note=Hello%20World&token=mysecretpassword

由于 Web 应用程序被授权代表您,它将能够打开电子表格并进行更改:

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

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

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