Google Sheets Add-On-Open()只运行一次,但onEdit()可以



我正在开发一个名为LastEdit的工作表加载项。我遇到的问题是onOpen()只在第一次安装Add-On时运行:

  • 该代码作为绑定脚本运行到我编写插件的原始工作表,效果良好;只有发布的加载项(安装到其他Google Drive帐户)才会出现问题
  • 如果我从Chrome Web Store安装加载项:
  • 安装了附加模块后,将自动打开新的无标题工作表
  • 第一次一切都很好:弹出帮助提示,填充AddonMenu,等等
  • 如果我刷新页面,Open()将停止工作。我仍然看到名为LastEdit的加载项菜单,但除了默认的帮助按钮外,它是空的;我所有的自定义菜单项都不见了
  • 如果我打开一张新的工作表,我会有同样的问题
  • 如果我转到加载项->管理加载项,并在此文档中单击管理->使用,则没有任何更改。我可以在任何组合中选中、取消选中和刷新页面,并且没有任何更改
  • 脚本在其他方面运行良好:调用onEdit()没有问题
  • 我在onOpen()的开头偷偷地添加了一个ui.alert();在自动打开第一张工作表时,我只看到一次此警报
  • 我试着从onOpen()中删除除ui.alert()之外的所有代码,但它甚至无法管理

那么,为什么onOpen()不再运行呢??

这是代码BTW:

var documentProperties = PropertiesService.getDocumentProperties();
var ui = SpreadsheetApp.getUi();
var sheet = SpreadsheetApp.getActive();
var editCell;
// This function runs whenever cells are edited
function onEdit() {
  updateLastEdit();
}
// This function updates the editCell contents
function updateLastEdit() {
  // Fetch the coordinate of the designated LastEdit cell
  editCell = documentProperties.getProperty('editCell');
  // If our docProp editCell is 0 then we don't have a LastEdit to update
  if (editCell != 0.0) {
    sheet.getRange(editCell).setValue(new Date() + '');
  }
}
// This function will be used to designate the new LastEdit cell
function lastEdit() {
  editCell =  sheet.getActiveCell()
  SpreadsheetApp.getUi().alert("LastEdit cell added at: " + editCell.getA1Notation());
  documentProperties.setProperty('editCell', editCell.getA1Notation());
  // Once we've stashed the location of the LastEdit cell we move to update the LastEdit cell contents
  updateLastEdit();
}
// When the Sheet opens add a new custom menu
function onOpen(e) {
  // This is the alert for testing purposes
  ui.alert("onOpen() has run!");
  // Contingency strategy; set an Installable Trigger to perform the onOpen tasks
  //ScriptApp.newTrigger("openTrigger").forSpreadsheet(sheet).onOpen().create();
  // Creating custom menu for this app
  newMenu = ui.createAddonMenu();
  newMenu.addItem('Insert LastEdit Cell', 'insertLastEdit');
  newMenu.addItem('Disable LastEdit Cell', 'disableLastEdit');
  newMenu.addItem('LastEdit Cell Location', 'locateLastEdit');
  newMenu.addSeparator();
  newMenu.addItem('About', 'aboutLastEdit');
  newMenu.addToUi();
  // I know this can be shortened, but I removed/tested each individual
  // item to see if any of these were derailing onOpen()
}
// Insert LastEdit Cell
function insertLastEdit() {
  lastEdit();
}
// Disable LastEdit Cell
function disableLastEdit() {
  documentProperties.setProperty('editCell', 0);
  SpreadsheetApp.getUi().alert("LastEdit cell disabled");
}
// Fetch and display the LastEdit cell location via popup
function locateLastEdit() {
  editCell = documentProperties.getProperty('editCell');
  if (editCell != 0) {
    SpreadsheetApp.getUi().alert("LastEdit cell is located at: " + editCell);
  } else {
    SpreadsheetApp.getUi().alert("No LastEdit cell is active ");
  }
}
// About! 
function aboutLastEdit() {
  ui.alert("About LastEdit", SpreadsheetApp.getUi().ButtonSet.OK);
}
// After installation just run the onOpen function
function onInstall(e) {
  onOpen(e);
}
// If an Installable Trigger is required...
function openTrigger() {
    // I had a duplicate of onOpen() in here, but have abandoned this strategy
}

我在这里错过了什么?插件授权似乎有很多移动部分(绑定脚本、简单触发器、在文档中启用、authMode.LIMITED与FULL等)。我查看了插件授权生命周期页面,但它似乎表明这个过程在很大程度上是自动处理的。

提前感谢您的帮助!

"如果为用户安装了加载项,但在当前文档中未启用,则onOpen(e)在AuthMode.NONE中运行;如果在当前文档启用了该加载项,则onOpen(e)将在AuthMode.LIMITED中运行。如果同时安装并启用了该添加项,则启用状态优先,因为LIMITED允许访问更多的应用程序脚本服务。"

当脚本在AuthMode.NONE上时,它无权访问属性服务。由于您有调用此服务的全局代码,因此如果执行onOpen()失败,则加载项。

您需要将此全局代码移动到函数中。

点击此处查看更多信息https://developers.google.com/apps-script/add-ons/lifecycle#authorization_modes

相关内容

  • 没有找到相关文章

最新更新