19

我的功能包括向文档添加菜单和吐司。我已经验证了触发器(onOpen)也已设置。它仅在用户进入工具、脚本管理器、运行时才有效。我们有太多具有太多背景的用户期望知道如何做到这一点。为什么它不起作用?(使用铬)

function onOpen()
{
  var menus = [{name: "Advance in Workflow", functionName:"sendEmail"}];

     SpreadsheetApp.getActiveSpreadsheet().addMenu("Auto Advance FG Workflow", menus);

  //sheet.toast(Notify/Remind users);
   sheet.toast("While you are here we kindly ask that you do not add, modify or remove     any columns.","Welcome - " + username,8);
 }

谢谢,

4

7 回答 7

38

我遇到了同样的问题。

我意识到,有时谷歌会创建某种脚本缓存(我曾经有一个“测试”脚本,我通常会更改它的内容,有时,脚本运行时就好像我没有那样运行)。

因此,我解决 onOpen() 不起作用的方法是更改​​函数名称并手动添加触发器。

去

转到“资源 -> 当前脚本的触发器...”

选择要在打开时运行的功能

选择要在打开时运行的功能

它在这里就像一个魅力!

更新的位置信息: 从工具栏从菜单栏

然后

触发选择

于 2012-11-23T10:44:32.083 回答
14

这是一篇旧帖子,但我刚刚遇到了这个问题,并找出了为什么它在我的情况下无法正常工作:我在脚本文件的顶部有一个需要一些授权并且阻止脚本正确运行的变量。我看到调用了 OP var username = Session.getActiveUser().getUsername();(这需要授权,这可能是原因)。

例如:此代码不起作用:

function onOpen(){
  SpreadsheetApp.getUi()
  .createMenu("Exportation")
  .addItem("Lancer l'exportation", "exportationMenu")
  .addToUi();
}
var stConsCons= SpreadsheetApp.openById(sgcid).getSheetByName("Consultant");

但这一个会起作用:

function onOpen(){
  SpreadsheetApp.getUi()
  .createMenu("Exportation")
  .addItem("Lancer l'exportation", "exportationMenu")
  .addToUi();
}

function whatever(){
  var stConsCons= SpreadsheetApp.openById(sgcid).getSheetByName("Consultant");
...}
于 2015-05-18T13:16:48.547 回答
3

原来需要把onOpen(e)函数加到Triggers中!

图片说明在这里

于 2021-08-19T09:42:07.437 回答
2

就我而言, onOpen 不起作用,因为我在函数之外有一个变量,用SpreadsheetApp.openById()而不是SpreadsheetApp.getActiveSpreadsheet(). openById()我猜即使您打开的工作表绑定到脚本,onOpen 也无法使用。onOpen()不适用于函数外部的这种变量:

var sheet = SpreadsheetApp.openById("1b_PQD...").getSheetByName("demos")

如果您的脚本绑定到工作表,您可以使用该getActiveSpreadsheet()功能解决此问题。否则,您可以通过将openById()调用放入函数来解决它。

于 2019-12-07T15:44:32.677 回答
2

在我的情况下,有一个参考错误,虽然没有完全停止脚本,但它确实阻止了菜单的出现。

我只有在对脚本运行调试后才能检测到该错误。

谷歌脚本调试选项

于 2016-10-24T14:01:54.190 回答
0

看起来问题可能是未定义“工作表”,这就是吐司失败的原因。

于 2012-11-15T03:18:26.770 回答
-1

如果缺少权限,简单触发器会静默失败。我在一个初始化非绑定文件的文件onOpen()对象的脚本中遇到了这个问题。我将所有 File 对象实例化移动到具有权限的菜单函数中。

换句话说,这行不通

function onOpen(e) {
   ...
   let file = DriveApp.getFileById(nonBoundFileId);
   ...
}

但这会起作用

function menuFunction() {
   ...
   let file = DriveApp.getFileById(nonBoundFileId);
   ...
}

因为 menuFunction 可以被授予简单触发器所缺乏的权限。

于 2022-01-02T16:27:55.660 回答