微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Apps 脚本中托管的书签在共享时无法运行

如何解决Apps 脚本中托管的书签在共享时无法运行

在带有书签的 Apps 脚本中部署我的网络应用程序后,它在我端工作正常,但是当我尝试共享我的网络应用程序时却没有,它会引发“不安全的 javascript”错误,例如从网络应用程序中单击它而不是像一个书签。

Web 应用程序作为用户访问运行,我们组织中的任何人都可以访问。 bookmarklet 的作用是运行输入提示并在当前页面上找到它。

代码如下:

<a id="bkmark">Link</a>

<script>
document.body.onload=()=>{
  google.script.run.withSuccessHandler(rep).getLink();
function rep(e){ 
document.querySelector('#bkmark').href = e; // return a javascript: IIFE wrapped in ``
}
}
</script>

我的 gs 从文件返回 Html 输出。 感谢任何帮助,谢谢!

解决方法

您可以使用 ContentService 和模板直接导入,而不是将 JavaScript 添加为小册子:

Page.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script src="<?= ScriptApp.getService().getUrl() + '?getAction=true' ?>" type="text/javascript" defer async></script>
  </head>
  <body>
    <button id="trigger" onclick="doAction()" disabled>Click here to do something</button>
  </body>
</html>

Code.js

function doGet(e) {
  const { getAction } = e.parameter
  if (getAction !== undefined) {
    return genAction()
  }

  return HtmlService.createTemplateFromFile('Page').evaluate().setTitle("Booklet webapp")
}


function genAction() {
  return ContentService
    .createTextOutput(`
      function doAction() {
        alert("Hello world!")
      }

      (function loaded() {
        document.getElementById("trigger").disabled = false
      })();
    `)
    .setMimeType(ContentService.MimeType.JAVASCRIPT)
}

注意脚本标签有 deferasync。这使得脚本不会在 DOM 完全加载后开始加载,而是开始异步加载(不会阻塞主线程)。

在 Apps 脚本方面,我们使用模板来动态获取脚本执行 URL(使用 ScriptApp.getService().getUrl())并添加查询参数(getAction)以便我们可以在doGet(e) 函数。在那里我们检查该参数,然后我们返回一个 JavaScript 内容。

还默认禁用按钮,我添加了一个小代码,以便在脚本加载完成后启用按钮(它是异步的,因此可能需要一些时间才能完全加载)。

此技术还可用于通过获取结果、创建脚本元素和手动添加内容来动态添加脚本标记。

参考文献

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。