【问题标题】:How to lock spreadsheet while standalone script is running如何在独立脚本运行时锁定电子表格
【发布时间】:2019-04-27 16:00:01
【问题描述】:

我有一个电子表格,它通过 onEdit 触发器调用独立脚本中的函数。独立函数有循环,可以在几秒钟内执行。如果用户在独立脚本运行时编辑另一行,则第二行的信息会与循环中第一行的信息混淆。

独立脚本中的代码是:-

var tasklistID="mytaslistid"
function getTasks() {
    var tasks=Tasks.Tasks.list(tasklistID)
    return tasks
}

电子表格中的代码是:-

function getTasks(){
    TaskManagerScript.getTasks()
}

安装的 onEdit 触发器调用电子表格 getTasks 函数,该函数又调用独立的 getTasks 函数

注意:这是我的代码的简化版本。实际版本还过滤任务以从特定日期提取任务。这涉及遍历列表中的任务,这需要时间

所以我需要一种方法来阻止编辑电子表格,直到独立脚本中的函数完成执行。

谢谢

【问题讨论】:

  • 这个问题太宽泛了,因为有几种方法可以做到这一点(更改电子表格共享设置、保护工作表/范围、使用 Apps 脚本锁定服务、使用模式对话框(已在答案中提及) )。
  • 所以TaskManagerScript 是一个库。对吗?
  • 是的,它是一个图书馆
  • return true 或来自getTasks() 函数的内容。您可能只需要在我对getTasks() 的回答中更改callStandaloneFunction()。安装的 onEdit() 应该运行另一个只打开我的模式对话框的函数。我的模态将调用getTasks() 并在从getTasks() 函数成功返回后关闭。
  • getTasks 函数需要在独立脚本中运行,否则您将获得用户的任务。我需要用户查看我创建的任务。另外据我了解,独立脚本无法在电子表格中打开 ui。

标签: google-apps-script google-sheets


【解决方案1】:

您可以使用modal 对话框:

模态对话框阻止用户与对话框以外的任何东西进行交互。

// Display a modal dialog box with custom HtmlService content and script
var htmlOutput = HtmlService
    .createHtmlOutput('<p>Please wait...</p>')
    .append('<script>google.script.run.withSuccessHandler(google.script.host.close).callStandaloneFunction()</script>')
    .setWidth(250)
    .setHeight(300);
SpreadsheetApp.getUi().showModalDialog(htmlOutput, 'My add-on');

【讨论】:

  • 我在电子表格的原始版本中使用了模态对话框,它使用了有界脚本并且效果很好。我在函数的开头有代码来打开对话框,最后有一个代码来关闭对话框。但是在切换到独立脚本后,我想不出办法做到这一点。我需要一种方法让独立脚本发回触发器以在它运行时关闭对话框。
  • @Sheils 您能否详细说明您如何将 onEdit 触发器与独立脚本一起使用?
  • 独立脚本中的代码是:- ` var tasklistID="mytaslistid" function getTasks() { var tasks=Tasks.Tasks.list(tasklistID) return tasks } ` 电子表格中的代码是:- ` function getTasks(){ TaskManagerScript.getTasks() } ` 安装的 onEdit 触发器调用电子表格 getTasks 函数,该函数又调用独立的 getTasks 函数
  • @Sheils 你能用这些信息编辑你的问题吗?
【解决方案2】:

根据 TheMaster 的评论,我提出了一个解决方法,其中涉及使用空的 while 循环。现在修改代码如下。

在绑定脚本中:-

function getTasks(){
    \\code to open modal dialog
    showDialog()

    \\Empty while loop with call to standalone script ==true as condition to end loop
    while(TaskManagerScript.addTask(e)==false){}

    \\code to close modal dialog
    closeDialog()

}

在独立脚本中:-

var tasklistID="mytaslistid"
function getTasks() {
    var tasks=Tasks.Tasks.list(tasklistID)
    \\some more codes
    return true
}

这个诀窍

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多