【问题标题】:How to I get a spreadsheet button to run a standalone script as me when the sheet is opened by another user account当另一个用户帐户打开工作表时,如何让电子表格按钮像我一样运行独立脚本
【发布时间】:2019-04-27 08:16:38
【问题描述】:

我在一个独立脚本中有一些代码,它从我的一个任务列表中返回任务。

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

当通过安装的onEdit 触发器调用代码时,代码工作正常。但是用户可能需要简单地刷新电子表格上的任务列表。所以我在有界脚本中插入了一个调用函数的按钮,该函数又调用了独立脚本中的函数

function getTasks(){
    TaskManagerScript.getTasks()
}

但这仅在电子表格在我的帐户中打开时才有效。在另一个帐户中打开时,它会返回其他用户的任务。

我尝试刷新电子表格并在 onOpen 触发器中运行 getTasks 函数,但这似乎不起作用。

我需要帮助才能找到解决方法。

【问题讨论】:

  • 使用网络应用以“我”身份运行并从您的脚本中调用此应用。
  • 我认为@TheMaster 的 cmets 可以解决您的问题。我注意到您正在寻找示例脚本和流程来解决您的问题。所以我提出了一个解决方法。你能确认一下吗?
  • TheMaster 的反应有点不清楚。我以为他是指将工作表和脚本都部署为 WebApp。我会试试你的示例代码并返回

标签: google-apps-script google-sheets


【解决方案1】:
  • 您的电子表格已与用户共享。
  • 您想让用户通过单击电子表格上的按钮来运行您的脚本。
  • 您想让用户使用您的任务列表。
    • 任务列表是你的。

如果我的理解是正确的,那么这个答案呢?请认为这只是几个答案之一。

问题原因:

当用户通过单击工作表上的按钮在电子表格上运行您的脚本时,该脚本将作为每个用户运行。这样,用户就无法从用户的任务列表中找到var tasklistID="mytasklistid" 中的mytasklistid。我认为你的问题的原因是这个。

解决方法:

作为几种解决方法之一,使用 Web 应用程序怎么样? TheMaster 也提到了这一点。当 Web Apps 部署为Execute the app as: Me 时,即使其他用户运行 Web Apps 的脚本,该脚本也会作为 Web Apps 的所有者(您)运行。在这种情况下,当用户通过单击按钮运行脚本时,用户会请求您使用 UrlFetchApp 部署的 Web 应用程序。这样,用户就可以使用您的任务列表 ID。此解决方法使用这种情况。此变通方法的流程如下。

  1. 将脚本部署为 Web 应用程序。
    • Execute the app as:设置为Me
    • Who has access to the app: 设置为Anyone, even anonymous。此设置用于测试。
  2. 用户使用已部署的 Web 应用,如外部 API。

这样,用户就可以使用你的任务列表了。

示例脚本:

示例脚本如下。服务器端(您的脚本)和客户端(用户的脚本)分别有 2 个示例脚本。您也可以将两个脚本放在同一个项目中。

  1. 请将“服务器端”复制并粘贴到您的项目中,并将其部署为 Web 应用程序。
    • 关于如何部署Web Apps,可以看here
  2. 请将“客户端”复制并粘贴到用户的项目中(电子表格的绑定脚本包括按钮)。此时,请将Web Apps的URL设置为https://script.google.com/macros/s/###/exec

服务器端:你的脚本

function doGet() {
  var tasks = getTasks();
  return ContentService.createTextOutput(JSON.stringify(tasks)).setMimeType(ContentService.MimeType.JSON);
}

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

客户端:用户脚本

请将此功能分配给按钮。

function getTask(){
  var url = "https://script.google.com/macros/s/###/exec";
  var tasks = UrlFetchApp.fetch(url);
  Logger.log(tasks)
}

注意:

  • 当您修改 Web Apps 脚本时,请重新部署为新版本。这样,最新的脚本就会反映到 Web 应用程序中。这一点对于使用 Web 应用程序很重要。
  • 在此解决方法中,库和客户端是分开的。作为客户端的用户从 Web 应用中检索数据。

参考资料:

如果我误解了您的问题并且这不是您想要的结果,我深表歉意。

【讨论】:

  • 如何调用webApp中的特定函数?
  • @Sheils 感谢您的回复。我为我不完整的答案道歉。 Web 应用程序用作服务器。部署 Web 应用程序时,您会检索像 https://script.google.com/macros/s/###/exec 这样的端点。该脚本通过使用UrlFetchApp.fetch(url) 向端点发出请求来运行。在我的回答中,Web Apps 的脚本在“客户端:用户脚本”中调用。
  • 好的,我为按钮创建了一个单独的脚本并将其部署为 webApp,这样就成功了。所以我有 3 个脚本,有界的,独立的库和按钮的 webApp。
  • @Sheils 感谢您的回复。很高兴您的问题得到解决。
【解决方案2】:

考虑将getTasks() 设置为在time-based trigger 上自动运行,该time-based trigger 将与您一样执行。

编辑菜单(在独立脚本中)> 当前项目的触发器 > 添加触发器按钮

如果基于时间的触发器的频率足够,则无需刷新按钮或网络应用部署。

【讨论】:

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