当前位置: 首页 > 知识库问答 >
问题:

Google Sheets Ad-On onOpen()只运行一次,但onEdit()很好

周马鲁
2023-03-14

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

  • 代码可以很好地作为绑定脚本运行到我编写附加组件的原始工作表中;只有发布的附加组件(安装到不同的Google Drive帐户)才会出现问题。

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

以下是代码,顺便说一句:

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 vs.FULL等)。我查看了加载项授权生命周期页面,但它似乎指出此过程主要是自动处理的。

提前感谢您的帮助!

共有1个答案

施知
2023-03-14

"如果为用户安装了加载项,但未在当前文档中启用,则onOpen(e)在AuthMode中运行。如果在当前文档中启用了加载项,则onOpen(e)在AuthMode中运行。有限公司。如果加载项已安装并启用,则启用状态优先,因为LIMITED允许访问更多应用脚本服务。"

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

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

在这里看到更多https://developers.google.com/apps-script/add-ons/lifecycle#authorization_modes

 类似资料:
  • 我希望一个进程在我启动我的网络服务后运行,然后每隔30分钟左右运行一次(我现在用较小的延迟测试它,只是为了看看它是否工作),但是我的进程从来不会运行超过一次。我做错了什么? 这是我的密码:

  • 我使用taskscheduleR来运行我的R代码。我必须运行一次的那个运行得很好,但是其他的(每小时、每周、每天等等)都不行。)工作,尽管其余报告“成功:已成功创建计划任务“test2” 这是我用来运行一次的代码(工作正常): 这是我用来运行WEEKLY的代码(不起作用): 在这种情况下没有生成日志,看起来任务从未计划过。 类似于每小时(不起作用):库(taskscheduleR)myscript

  • 是否可以只在指定的时间安排一次Spring服务方法?例如,当前时间是下午2点,但当我点击action按钮时,我希望我的服务方法在晚上8点开始。我很熟悉@Schedured注释,我不确定如何编写不定期运行的cron表达式。这个每天晚上8点触发。 有什么建议吗?

  • 当我在其上传递一个帐户时,我的if会运行两次 所以是正确的: 因此它执行两次: 如何使用-400只运行一次?

  • 在Netbeans中,经过一些研究,我成功地编辑了文件构建。xml来定制IDE生成jar和清单文件的方式。我不得不为Eclipse迁移一个项目,甚至找到了构建jar的选项,但我需要用一些个性化信息构建jar。 我添加了文件构建。xml在我的eclipse项目中作为构建文件ANT,但当我发送并执行它时,eclipse运行两次,一次生成2个jars文件。 遵循我的文件构建。xml: 需要指出的是,ec

  • 问题内容: 如标题所示,方案是:首次使用该应用程序时,显示屏幕A。完成屏幕A后,该按钮将引导您进入屏幕B。从现在开始,直到永远,屏幕B始终是主屏幕“启动应用程序时,屏幕上显示“屏幕(活动?)”。我正在尝试这2天,但我收不到。有人请解释一些细节,甚至最好给我扔一个code.rar,这样我就可以研究它。我为此感到疯狂!!! 问题答案: 只需在AndroidManifest.xml中将您的Activit