首页 文章

在Google Apps Sheet插件中加载外部工作表

提问于
浏览
1

我为我的公司创建了一个简单的插件 . 调用时,插件会查看当前工作表,并用给定词汇表中的相应值替换所有单元格 .

例如,它将找到值为“Brand”的所有单元格,并将其替换为“123_brand”,将“Name”替换为“321_name”等 .

为此,我使用本地工作表(“词汇表”),其行上的所有数据(第一列有“品牌”,“名称”等,而第二列有“123_brand”,“321_name”等) . 我公司的所有成员都在该表上阅读了授权 .

我按以下方式加载它:

function onOpen() {
  SpreadsheetApp.getUi().createAddonMenu()
      .addItem('Parse sheet', 'parseSheet')
      .addToUi();
}

function onInstall(){
 onOpen(); 
}

var librarySpreadsheet = SpreadsheetApp.openById("ID to my Glossary Sheet");

function parseSheet(){
  /* Does the sheet parsing */
}

问题是:它不起作用 .

安装后,“Parse Sheet”按钮正常显示,一切正常 . 但是如果用户转到另一张表,则插件在那里不起作用 . 检查控制台会显示以下消息:

Google Apps脚本:您无权执行该操作 .

如果用户删除并重新安装该另一个工作表中的插件,它将再次开始正常工作 .

我尝试提供编辑授权,但它仍然无效 . 这适用于所有用户,甚至是我自己 .

Why is my addon being denied access to an external spreadsheet, except right after installing it?

1 回答

  • 1

    这个全局声明是他在你的插件中没有看到你的附加菜单功能的原因:

    var librarySpreadsheet = SpreadsheetApp.openById("ID to my Glossary Sheet");
    

    这是全局演化,即未在您的函数中声明 . 因此,在打开新文档时调用onOpen()函数时会出现这种情况 . 这是文档页面的引用

    警告:当您的onOpen(e)函数运行时,将加载整个脚本并执行任何全局语句 . 这些语句在与onOpen(e)相同的授权模式下执行,如果模式禁止它们将失败 . 这可以防止onOpen(e)运行 . 如果您发布的加载项无法添加其菜单项,请在浏览器的JavaScript控制台中查看是否抛出错误,然后检查脚本以查看onOpen(e)函数或全局变量是否调用不允许的服务在AuthMode.NONE中 .

    插件已安装但未在新电子表格中启用,因此在 authMode.None 授权中运行 . 在该授权模式下,它无权打开任何电子表格 . 因此,全局声明失败并且onOpen过早终止而不添加菜单项 .

    我的修复建议是将整个声明移到你的parseSheet函数中

    function parseSheet(){
    var librarySpreadsheet = SpreadsheetApp.openById("ID to my Glossary Sheet");
      /* Does the sheet parsing */
    }
    

    或者你可以尝试这样做,如果你想 librarySpreadsheet 是一个全局变量:

    var librarySpreadsheet
    function parseSheet(){
        librarySpreadsheet = SpreadsheetApp.openById("ID to my Glossary Sheet");
          /* Does the sheet parsing */
        }
    

    最后,重新安装时为什么会这样? (@SandyGood已在评论中回答!)安装后,插件运行在 authoMode.FULL ,因为它需要用户交互才能安装授权 . 从文档引用

    从商店安装加载项时,其onInstall(e)函数在AuthMode.FULL中运行

    因此,当它重新安装时,它能够获得该全局声明并且还启用该文档的插件 . 因此,插件适用于未来的运行以及该文档

相关问题