在 Google 应用 Sheet 插件中加载外部 sheet
Load external sheet in Google Apps Sheet addon
我为我的公司创建了一个简单的插件。调用时,插件查看当前 sheet,并用给定词汇表中的相应值替换所有单元格。
例如,它会找到所有值为"Brand"的单元格,并将它们替换为“123_brand”,将"Name"替换为“321_name”等.
为此,我使用本地 sheet ("Glossary sheet"),所有这些数据都在其行中(第一列有 "Brand"、"Name" 等. 而第二列有“123_brand”、“321_name”等)。我公司的所有成员都对该 sheet.
进行了阅读授权
我是这样加载的:
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"按钮正常出现,一切正常。但是,如果用户转到另一个 sheet,则该插件在那里不起作用。检查控制台显示以下消息:
Google Apps Script: You do not have permission to perform that action.
如果用户在另一个 sheet 中删除并重新安装插件,它将再次开始正常工作。
我尝试改为授予编辑权限,但仍然无效。这适用于所有用户,包括我自己。
为什么我的插件被拒绝访问外部传播sheet,除非刚安装它?
此全局声明是您在插件中看不到插件菜单功能的原因:
var librarySpreadsheet = SpreadsheetApp.openById("ID to my Glossary Sheet");
这是全局声明,即未在您的函数中声明。在打开新文档时调用 onOpen() 函数时执行。这是来自文档页面的引用
Warning: When your onOpen(e) function runs, the entire script is loaded and any global statements are executed. These statements execute under the same authorization mode as onOpen(e) and will fail if the mode prohibits them. This prevents onOpen(e) from running. If your published add-on fails to add its menu items, look in the browser's JavaScript console to see if an error was thrown, then examine your script to see whether the onOpen(e) function or global variables call services that aren't allowed in 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
中运行,因为它需要用户交互才能获得安装授权。引用文档
When an add-on is installed from the store, its onInstall(e) function
runs in AuthMode.FULL
因此,当它被重新安装时,它能够获得该全局声明并为该文档启用插件。因此,该插件在以后的运行中也能正常运行该文档
我为我的公司创建了一个简单的插件。调用时,插件查看当前 sheet,并用给定词汇表中的相应值替换所有单元格。
例如,它会找到所有值为"Brand"的单元格,并将它们替换为“123_brand”,将"Name"替换为“321_name”等.
为此,我使用本地 sheet ("Glossary sheet"),所有这些数据都在其行中(第一列有 "Brand"、"Name" 等. 而第二列有“123_brand”、“321_name”等)。我公司的所有成员都对该 sheet.
进行了阅读授权我是这样加载的:
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"按钮正常出现,一切正常。但是,如果用户转到另一个 sheet,则该插件在那里不起作用。检查控制台显示以下消息:
Google Apps Script: You do not have permission to perform that action.
如果用户在另一个 sheet 中删除并重新安装插件,它将再次开始正常工作。
我尝试改为授予编辑权限,但仍然无效。这适用于所有用户,包括我自己。
为什么我的插件被拒绝访问外部传播sheet,除非刚安装它?
此全局声明是您在插件中看不到插件菜单功能的原因:
var librarySpreadsheet = SpreadsheetApp.openById("ID to my Glossary Sheet");
这是全局声明,即未在您的函数中声明。在打开新文档时调用 onOpen() 函数时执行。这是来自文档页面的引用
Warning: When your onOpen(e) function runs, the entire script is loaded and any global statements are executed. These statements execute under the same authorization mode as onOpen(e) and will fail if the mode prohibits them. This prevents onOpen(e) from running. If your published add-on fails to add its menu items, look in the browser's JavaScript console to see if an error was thrown, then examine your script to see whether the onOpen(e) function or global variables call services that aren't allowed in 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
中运行,因为它需要用户交互才能获得安装授权。引用文档
When an add-on is installed from the store, its onInstall(e) function runs in AuthMode.FULL
因此,当它被重新安装时,它能够获得该全局声明并为该文档启用插件。因此,该插件在以后的运行中也能正常运行该文档