调用SpreadsheetApp.getUi()。alert();阻止服务器功能通过google.script.run

时间:2019-04-05 12:40:37

标签: google-apps-script

你好,谢谢!

我用一个按钮在Google Spreadsheet中创建了一个侧面板。单击该按钮将运行服务器功能。此功能显示一个警报框,并将文本插入特定的单元格。

工作示例:

https://docs.google.com/spreadsheets/d/1Mv-0YRSJJpwSaRh_xAeZDtVqL-P-e5nS80fUJIq_CJ4/edit?usp=sharing

现在是棘手的部分: 我正在其他共享表中使用此代码,因为它包含机密数据。在此工作表中,该函数仅在我通过alert()调用删除或//禁用该行时运行。

我知道很难找到这样的错误,但是也许有人知道它可能是什么?

CODE.GS

function onOpen() {
  // Add a custom menu to the spreadsheet.
  SpreadsheetApp.getUi() // Or DocumentApp or FormApp.
  .createMenu('Custom Menu')
  .addItem('myToDoPanelLabel', 'showTestPanel')
      .addToUi();
}

function insert(value) {
  SpreadsheetApp.getUi().alert("Message"); //with this line it only works in test sheet but not in the original sheet
  var thisID="1Mv-0YRSJJpwSaRh_xAeZDtVqL-P-e5nS80fUJIq_CJ4";
  var ss = SpreadsheetApp.openById(thisID).getSheetByName("Tab1");
  ss.getRange(1,2).setValue("New Txt");

}


function showTestPanel() {
var template = HtmlService.createTemplateFromFile('panel');
  var htmlOutput = template.evaluate()
  .setTitle('ToDoPanel');
  SpreadsheetApp.getUi().showSidebar(htmlOutput); 
}

PANEL.HTML

<script>
  window.mark = function() {
   google.script.run.insert();
  };
</script>

<button onclick='mark()'>click me</button>

编辑:问题的核心是没有对话框出现!通过alert()调用,它将停止代码(可以在Scrip日志记录“等待用户响应时超时”中看到超时)。使用以下建议的解决方案,它将执行但仍不会显示自定义对话框。 这是权限问题吗?

1 个答案:

答案 0 :(得分:1)

好吧,.alert阻止了服务器的执行。报价:

  

在用户的编辑器中打开一个对话框,其中包含给定的消息和一个“确定”按钮。打开对话框时,此方法将挂起服务器端脚本。在用户关闭对话框后,该脚本将继续执行,但是Jdbc连接和LockService锁不会在整个暂停期间持续存在。

根据他们在their Dialog guide中的建议,您可以使用“自定义”对话框:

  

自定义对话框请勿在对话框打开时暂停服务器端脚本。客户端组件可以使用HTML服务界面的google.script API或UI服务界面的服务器处理程序,对服务器端脚本进行异步调用。

因此,创建自定义对话框可能会解决您的问题。