【问题标题】:Load external sheet in Google Apps Sheet addon在 Google Apps 表格插件中加载外部表格
【发布时间】:2017-05-12 09:49:14
【问题描述】:

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

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

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

我通过以下方式加载它:

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 */
}

问题是:它不起作用。

安装后,“解析表”按钮正常出现,一切正常。但是,如果用户转到不同的工作表,则插件无法在那里工作。检查控制台显示以下消息:

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

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

我尝试改为授予编辑授权,但它仍然不起作用。这适用于所有用户,包括我自己。

为什么我的插件在安装后被拒绝访问外部电子表格?

【问题讨论】:

  • 我猜它与“授权模式”有关。 Quote: 从商店安装插件时,其 onInstall(e) 函数在 AuthMode.FULL 中运行。 AuthMode 可以在插件安装后更改安装。你读过Link to Add-on Authorization Lifecycle
  • 当你说插件不起作用时,是否意味着你在插件菜单下看不到这个特定的插件?
  • @JackBrown 我的意思是我在插件菜单中看到了插件,但没有它的功能,只是“帮助”
  • @SandyGood 这似乎真的很适合我的问题,是的......我会测试一下,看看效果如何
  • 我将onInstall 函数放在code.gs 的最顶部。在onInstall() 之前有onOpen()。我无法证明这样会更好,但有一个问题我认为已经解决了。我知道这听起来很愚蠢,但改变它的成本很低。

标签: google-apps-script google-sheets google-apps google-sheets-api


【解决方案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 已经在 cmets 中回答了!)安装后,插件在 authoMode.FULL 中运行,因为它需要用户交互才能安装授权。引用文档

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-05
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    相关资源
    最近更新 更多