Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 仅应用程序脚本CurrentDoc作用域阻止在其他文档中使用附加组件_Google Apps Script_Scope_Permissions_Authorization_Google Apps Script Addon - Fatal编程技术网

Google apps script 仅应用程序脚本CurrentDoc作用域阻止在其他文档中使用附加组件

Google apps script 仅应用程序脚本CurrentDoc作用域阻止在其他文档中使用附加组件,google-apps-script,scope,permissions,authorization,google-apps-script-addon,Google Apps Script,Scope,Permissions,Authorization,Google Apps Script Addon,几年前,我为谷歌文档发布了一个附加组件,当时附加组件被发布到Chrome网站商店。我在主脚本顶部添加了@OnlyCurrentDoc标记,以缩小权限:该插件只需编辑正在使用的文档,而不必访问Google Drive中的任何其他文档。起初,它似乎工作得很好。现在加载项已经转换到GSuite Marketplace,我已经更新并重新发布了加载项,但我开始在Stackdriver错误日志中收到一些通知,表明某些用户“没有权限这样做”。我已将所有需要权限的脚本调用保留在“onOpen”函数的范围内,并检

几年前,我为谷歌文档发布了一个附加组件,当时附加组件被发布到Chrome网站商店。我在主脚本顶部添加了
@OnlyCurrentDoc
标记,以缩小权限:该插件只需编辑正在使用的文档,而不必访问Google Drive中的任何其他文档。起初,它似乎工作得很好。现在加载项已经转换到GSuite Marketplace,我已经更新并重新发布了加载项,但我开始在Stackdriver错误日志中收到一些通知,表明某些用户“没有权限这样做”。我已将所有需要权限的脚本调用保留在“
onOpen
”函数的范围内,并检查
“e.AuthMode==ScriptApp.AuthMode.Limited | e.AuthMode==ScriptApp.AuthModeFull
”。没有任何授权(“
e.AuthMode===ScriptApp.AuthModeNone
”)该插件几乎不能做任何事情,它只会使用“
DocumentApp.getUi().alert()
”发出警报,让用户知道他们需要授权该插件才能执行任何操作

所以我想知道,是什么导致了“用户没有权限这么做”的错误?脚本是否需要权限才能调用“
DocumentApp.getUi()
”?然而,我在文档中看到过这样的例子,即在
AuthModeNone
的情况下,您仍然可以创建一个基本的侧栏,它不需要用户的任何特定权限,这样它们就不会什么都没有了。然而,在我看来,使用
HtmlService
创建任何类型的用户界面(如侧边栏或模式)都需要权限,所以我避免了这一点,但我仍然看到这个错误

现在,我甚至注意到,当我在Google帐户上安装该插件时(事实上,该插件已为任何Google帐户启用,而不仅仅是GSuite帐户),它可以在我安装它时打开的文档中找到,但是,如果我创建了一个新文档,我会得到一个空的加载项菜单,并且会得到我创建的UI警报,说加载项需要权限才能工作。然后我可以转到管理加载项:我的加载项显示为正在安装,如果我单击上下文菜单中的三个点,我会看到“在此文档中使用”未选中。如果我选中它,附加菜单将不会立即可用,但是如果我刷新页面,它有时可用,有时不可用。 如果我随后单击“附加组件”菜单中的“文档附加组件”,将打开一个边栏,其中包含我的附加组件徽标和一个按钮“使用”,该按钮有时为蓝色(表示已启用),并提供与我的附加组件创建的菜单相同的菜单,但有时为灰色且不可点击,从而阻止我为此文档启用它。即使是文档刷新也不一定能解决这个问题。我可以看出,对于任何试图使用该插件的特定用户来说,这是多么令人沮丧

完全删除
@OnlyCurrentDoc
标记(以及GSuite Marketplace中的相对权限范围)是否会更简单,这样我就可以确保用户在需要时可以使用该插件?在我看来,试图通过使用这个缩小的范围来保护用户隐私实际上在授权对话框中创建了一个额外的“需要权限”行,这似乎违反了直觉,这使得用户似乎必须授予更多的权限,而实际上这意味着需要更窄的权限。然后实际使用附加组件变得更加令人沮丧,是否真的值得使用这个缩小的范围? 下面是我自己看到的一些屏幕截图,我可以想象许多其他用户也看到了(如果用户的体验令人沮丧,他们可能会因为一个附加组件而给他们一个坏名声分数,这只是为了保护他们的隐私!)

刷新文档后,本次创建了加载项菜单,转到“文档加载项”显示此文档已启用加载项菜单;然而,有时这不起作用,“使用”按钮变灰了

以下是一些示例代码:

/**
*@OnlyCurrentDoc
*/
函数onInstall(e){
//首次安装时自动显示使用说明
openHelpSidebar();//这使用HtmlService创建侧栏,我们是否需要检查授权才能创建和打开此侧栏?
//将插件菜单添加到工具栏(根据AuthMode)
onOpen(e);
}
功能开启(e){
if(e&&(e.authMode==ScriptApp.authMode.LIMITED | | e.authMode==ScriptApp.authMode.FULL)){
//仅在用户授予属性服务权限后初始化用户首选项!
//如果尚未设置属性,请使用propertiesservice设置默认用户属性
...
//并创建我们的菜单项
DocumentApp.getUi().createAddonMenu()文件
.addItem(_u('Start',locale),'openMainSidebar')
.addSeparator()
.addItem(_('Instructions',locale),'openHelpSidebar')
.addItem(uuu('Send Feedback',locale),'opensendfedback')
.addItem(uuu('contribution',locale),'opencontributionmodel')
.addToUi();
}
else{//如果e.AuthMod==ScriptApp.AuthMode.NONE
//如果权限为无,我可以创建任何类型的UI吗?在我看来,如果权限为无,尝试创建任何类型的菜单项以打开侧栏或HtmlService模式将生成错误
DocumentApp.getUi().alert('您必须授予正确的权限才能使用此加载项。若要解决此问题,请删除加载项并重新安装,授予请求的权限。');//或许可以先尝试刷新页面?然后尝试从加载项菜单中的“文档加载项”菜单项启用文档?
}
}
当然,只有当附加组件实际发布到市场上,非GSuite用户才能安装它时,这才是真正可以测试的。

My rules Of thu
function onOpen(e) {
  var menu = SpreadsheetApp.getUi().createAddonMenu(); // Or DocumentApp.
  if (e && e.authMode == ScriptApp.AuthMode.NONE) {
    // Add a normal menu item (works in all authorization modes).
    menu.addItem('Start workflow', 'startWorkflow');
  } else {
    // Add a menu item based on properties (doesn't work in AuthMode.NONE).
    var properties = PropertiesService.getDocumentProperties();
    var workflowStarted = properties.getProperty('workflowStarted');
    if (workflowStarted) {
      menu.addItem('Check workflow status', 'checkWorkflow');
    } else {
      menu.addItem('Start workflow', 'startWorkflow');
    }
  }
  menu.addToUi();
}