【问题标题】:google apps script: setNote() from the cell itself谷歌应用程序脚本:来自单元格本身的 setNote()
【发布时间】:2018-02-01 00:08:32
【问题描述】:

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

我试过这个功能

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),这很明显,因为我无法使用“单元格函数”(在单元格中输入/键入的函数而不是 GAS/JavaScript 函数本身)编辑任何单元格。

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

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

【问题讨论】:

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


    【解决方案1】:

    实际上,没有。内置电子表格函数不会创建便笺。创建便笺的两种方法是:手动和使用 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
    

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

    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 和工作表名称也可以作为 URL 参数发送。

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

    【讨论】:

    • 好的,谢谢。尽管这不是解决方案,但只是一种解决方法。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2018-10-27
    • 1970-01-01
    • 2020-10-31
    相关资源
    最近更新 更多