为啥我不能从 Google AppScript for Sheets 的侧边栏中调用服务器函数? [复制]

Posted

技术标签:

【中文标题】为啥我不能从 Google AppScript for Sheets 的侧边栏中调用服务器函数? [复制]【英文标题】:Why can't I call a server function from the sidebar in Google AppScript for Sheets? [duplicate]为什么我不能从 Google AppScript for Sheets 的侧边栏中调用服务器函数? [复制] 【发布时间】:2020-06-11 19:00:38 【问题描述】:

我在从 Google 表格的 html 边栏中调用服务器端 Apps 脚本函数时遇到问题。

我已经用下面的简单示例代码复制了我的问题。

应该怎么做

单击该按钮应在我的 Code.gs 脚本中调用 alert 并向用户显示警报。

实际发生的情况

点击按钮显示错误:

We're sorry, a server error occurred while reading from storage. Error code PERMISSION_DENIED.

alert() 的 Apps 脚本仪表板的“执行”部分中没有任何条目,因此该函数似乎从未被调用过?

代码.gs:

function onOpen() 
  const ui = SpreadsheetApp.getUi();
  ui.createMenu('Matthew')
    .addItem('Show Sidebar', 'sidebar')
    .addToUi();
;

function sidebar() 
  const html = HtmlService.createHtmlOutputFromFile('test.html')
    .setTitle('Matthew Experiment')
    .setWidth(300);

  SpreadsheetApp.getUi().showSidebar(html);




function alert() 
  SpreadsheetApp.getUi().alert("alert!"); 


test.html(以及正文)

  <body>
    <div class="container">
       <button class="btn btn-success" onclick="doSomething()">Click Me!</button>
    </div>
    <script>
            function doSomething() 
          google.script.run.withFailureHandler(function(error) 
            console.log("error")
            console.log(error.message)
          ).withSuccessHandler(function(result) 
            console.log("done!")
          ).alert();
        
    </script>
  </body>

我已经确认客户端代码正确地使用了服务器端函数名称,它只是调用了不起作用的函数。

我的代码似乎与所有入门指南相同,但我没有看到其他人发布有关此问题的帖子。希望这里有人比我更了解这个问题。

更新,更奇怪

我打开了一个私人窗口,它工作,所以我想,也许这是一个引起问题的扩展程序?但即使禁用所有扩展也不能在主窗口中修复它。我已经注销/登录到我的谷歌帐户,但如果不打开私人浏览器窗口,它仍然无法正常工作。

这个问题在 chrome/edge/firefox 中是一致的。

【问题讨论】:

相关:***.com/q/60412319 根据 issuetracker 的说法,这仅在 chrome 中发生,当全局登录用户与脚本和电子表格的所有者不同时。 我既是脚本的所有者,也是电子表格的所有者,在 FF 中也是如此。 :-( 哦,是的,我的主要用户是我的 gmail 帐户,这是我的辅助帐户 @TheMaster 我会深入研究这个问题,你可能已经想通了 【参考方案1】:

当全局登录用户与脚本所有者不同时会发生这种情况。

注销您的所有 google 帐户,然后使用您用于创建脚本的帐户重新登录。这解决了问题。

【讨论】:

这是一个非常可怕的错误,意味着侧边栏几乎没有用,除非你正在构建一个完全成熟的插件【参考方案2】:

这是一个与服务器通信的侧边栏对话框的简单示例

function showMySideBar() 
  var html='<input type="button" value="Click Me" onClick="doSomething()" />';
  html+='<script>function doSomething()google.script.run.withSuccessHandler(function(msg)window.alert(msg);).pleaseHelp();</script>';
  SpreadsheetApp.getUi().showSidebar(HtmlService.createHtmlOutput(html));
 

function pleaseHelp() 
  return 'What can I do to help?';

【讨论】:

以上是关于为啥我不能从 Google AppScript for Sheets 的侧边栏中调用服务器函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Google 表格/AppScript - 将数据从一张表格复制到另一张表格

未返回Google Appscript VALUE

某些Google幻灯片AppScript是否已记录但不受支持?

Google Sheets AddOn - 通过服务帐户集成 AppScript 和 BigQuery

php [appscript api] google app script api

如何使用 AppScript 在 BigQuery 中将 Google 工作表持久化为表格