按顺序运行多个 Google Apps 脚本(一个接一个)

问题描述 投票:0回答:1

我正在制作一个工作表,该工作表从 API 中提取数据,然后对其运行计算。由于超时和限制,我需要运行一个脚本,等待计算完成,然后运行另一个脚本。

有没有办法让工作表(或脚本)等待运行一个函数,直到工作表中的单元格显示特定值?(这是我的解决方法)

背景

我为我妻子的夏令营做了一些电子表格工作,他们希望获得营员人数的每日更新。他们的 CRM(campminder)有一个 API,我调用它来获取各种信息:

  1. API 密钥 (
    Get_Key
    )
  2. 所有营员的更新名单(
    Get_Campers
    )
  3. 每个营员的详细信息(
    Get_Camper_Details
    )

所以操作顺序是:

  1. 奔跑
    Get_Key
  2. 等待直到
    Get_Key
    完全(并成功)执行,然后运行
    Get_Campers
  3. 等待直到
    Get_Campers
    完全(并成功)执行,然后在每个camper_id旁边放置一个
    Get_Camper_Details
    公式(
    IMPORTAPI
    函数)。 AFAIK,没有办法批量获取露营者详细信息。
  4. 等待,直到
    Get_Camper_Details
    完全(并成功)执行每个露营者,然后将所有详细信息复制到新表并删除IMPORTAPI
    公式,这样它们就不会不断重新计算。
当我观看和等待时,我已经让上述所有步骤正常运行,但我很想自动化这一点 - 理想情况下在计时器上,但至少以一种方式单击按钮即可按顺序运行所有四个步骤.

有没有办法在 Apps 脚本中执行此操作?

谢谢! JSB

当我观看和等待时,我已经完成了上述所有步骤,可以正常运行,但我很想自动执行此操作 - 理想情况是每天一次(定时),但至少按一下按钮即可运行所有四个步骤按顺序执行步骤。

我还查看了

这个答案,它将按顺序运行函数,但不等待具体结果。

我已经设置了一个计数器来告诉我何时可以安全地运行最终(复制/删除)功能。我可以用它作为最后一个的触发器。

javascript google-sheets google-apps-script google-apps-script-api
1个回答
0
投票
嗯,Google Sheets 的限制和配额相当复杂。我所做的(正如您在解决方法中提到的)是有一个单元格,其中包含我所在的步骤,并从该位置继续。

因此,您可以使用名为“stageChecker”的功能或根据您的意愿在分钟计时器上设置一个

可安装的触发器。它检查阶段,如果它说“停止”,它就会结束,如果它说“Get_Key”,“Get_Campers”,“Get_Camper_Details”,它就会运行这些功能,如果它说“运行”,它也会结束,所以这意味着其中另一个三个函数正在运行。因此,每个函数都可以有一个开始和结束子句,将特定单元格更改为“正在运行”以及相应的下一阶段的名称。

类似这样的:

function stageChecker() { // Open the active spreadsheet and get the stage value from a specific cell var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Control"); // Sheet where the stage is stored var stageCell = sheet.getRange("A1"); // Adjust cell reference var stage = stageCell.getValue(); // Get the current stage switch(stage) { case "Stop": // Stop the process if the stage is "Stop" Logger.log("Process stopped."); return; case "Get_Key": // Call the function to get the key Logger.log("Getting Key..."); getKey(); // Your function to get the key break; case "Get_Campers": // Call the function to get campers Logger.log("Getting Campers..."); getCampers(); // Your function to get campers break; case "Get_Camper_Details": // Call the function to get camper details Logger.log("Getting Camper Details..."); getCamperDetails(); // Your function to get camper details break; case "Running": // If the stage says "Running," do nothing (since another function is already executing) Logger.log("Process is already running."); return; default: Logger.log("Unknown stage: " + stage); return; } }
例如 getKey():

function getKey() { var sheet = SpreadsheetApp.getActive() var stageCell = sheet.getRange("A1") stageCell.setValue("Running") //The rest of your code stageCell.setValue("Get_Campers") }
您可以将最终函数设置为将值更改为“停止”,并且仅再次运行“getKey”一次,其余的将从该阶段开始逐分钟继续。如果清楚的话请告诉我:)

© www.soinside.com 2019 - 2024. All rights reserved.