проверить, выполняется ли в данный момент выполнение триггера в скриптах Google Apps - PullRequest
2 голосов
/ 06 октября 2019

Можно ли увидеть, имеют ли триггеры конкретного проекта какие-либо активные / запущенные исполнения?

У меня есть одноразовый скрипт / проект миграции для обновления тысяч наших файлов Google Sheets в новый формат шаблона. Скрипт, по моим подсчетам, будет запускаться часами. Наша среда G-Suite Enterprise имеет 30-минутное ограничение на выполнение.

Мой код написан так, что в случае сбоя сценария по какой-либо причине я могу просто повторно запустить его и продолжить с того места, где он остановился.

Иногда сценарий завершается ошибкой для другихпричины - например, ошибка памяти или проблемы с сетевым подключением.

Итак, я хочу установить 15-минутный триггер для запуска сценария. И я хочу, чтобы он проверил, выполняется ли еще одно выполнение. Если это так, то это остановится. Если это не так, то это будет продолжаться.

Я знаю, как использовать ScriptApp.getProjectTriggers(), чтобы увидеть триггеры, связанные с проектом, но из-за этого я не знаю, как найти запущенные исполнения.

1 Ответ

3 голосов
/ 07 октября 2019
  • Вы хотите знать, выполняется ли сейчас сценарий по управляемому временем триггеру.
  • Вы хотите добиться этого с помощью скрипта Google Apps.

Если мойпонимание правильно, как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких ответов.

Решение:

Я думаю, что ваша цель может быть достигнута с помощью метода process.list в API скриптов Google Apps. Когда метод process.list в Google Apps Script API запрашивает во время выполнения сценария триггером, управляемым временем, можно получить следующее значение:

{
 "processes": [
  {
   "projectName": "sampleProject",
   "functionName": "myFunction",
   "processType": "TIME_DRIVEN",
   "processStatus": "RUNNING",  // <--- here
   "userAccessLevel": "OWNER",
   "startTime": "2019-10-07T00:00:00.000Z",
   "duration": "36.145s"
  }
 ]
}

В этом случае processStatus - этоRUNNING. Когда сценарий завершен, processStatus изменяется на COMPLETED.

Пример сценария для получения информации, когда processStatus равен RUNNING, выглядит следующим образом.

Использование:

1. Связывание проекта облачной платформы с проектом скрипта Google Apps

В этом случае необходимо связать проект облачной платформы с проектом скрипта Google Apps. О том, как связать это, вы можете увидеть в здесь .

2. Включите API скриптов Google Apps

На втором этапе включите API скриптов Google Apps на консоли API. О том, как его включить, вы можете увидеть в этой теме .

3. Запустите пример сценария:

function sample() {
  var scriptId = "###"; // Please set the script ID here.
  var functionName = "###"; // Please set the function name here.

  var url = "https://script.googleapis.com/v1/processes?userProcessFilter.functionName=" + functionName + "&userProcessFilter.scriptId=" + scriptId;
  var res = UrlFetchApp.fetch(url, {headers: {Authorization: 'Bearer ' + ScriptApp.getOAuthToken()}});
  var obj = JSON.parse(res);
  var runningScript = obj.processes.filter(function(p) {return p.processType == "TIME_DRIVEN" && p.processStatus == "RUNNING"});
  Logger.log(runningScript)
}
  • При использовании этого сценария добавьте область действия https://www.googleapis.com/auth/script.external_request и https://www.googleapis.com/auth/script.processes. Поэтому, пожалуйста, добавьте их в файл манифеста (appsscript.json).
  • Когда вы используете этот скрипт, пожалуйста, установите переменные scriptId и functionName, которые запускаются при срабатывании временного триггера.
  • В этом сценарии, когда нет запущенного scrit, возвращается [].
  • Если вы хотите узнать другие типы процессов, пожалуйста, измените p.processType == "TIME_DRIVEN".

Примечание:

  • Я думаю, что в вашем случае вы также можете использовать Метод: process.listScriptProcesses .
  • По моему опыту, когда скриптзакончено, был случай, когда processStatus иногда становился UNKNOWN. Но в данном случае это означает, что скрипт завершен.

Ссылки:

Если я неправильно понял ваш вопрос, и это не то направление, которое вам нужно, я приношу свои извинения.

Добавлено:

Я думаю, что метод, использующий API-интерфейс скриптов Apps, является одним из решений. Чтобы достичь своей цели без привязки проекта облачной платформы к проекту GAS, здесь я хотел бы предложить обходной путь.

В этом обходном пути я использовал свойство Drive API. Когда используется свойство Drive API, свойство может быть извлечено другим проектом. Итак, здесь я использовал свойство Drive API. Пожалуйста, подумайте об этом как об одном из нескольких обходных путей.

Использование:

1. Включить Drive API в расширенных службах Google

Сначала , пожалуйста, включите Drive API в расширенных службах Google.

2. Примеры сценариев:

Пример сценария 1:

Пожалуйста, скопируйте и вставьте следующий сценарий. Предполагается, что функция runByTrigger запускается управляемым по времени триггером.

function runByTrigger(e) {
  var fileId = "###"; // Please set the file ID.

  if (e && "triggerUid" in e && e.triggerUid != "") {
    Drive.Files.update({properties: [
      {key: "processStatus", value: "RUNNING", visibility: "PUBLIC"},
      {key: "processStartTime", value: new Date().toISOString(), visibility: "PUBLIC"},
    ]}, fileId);
  }

  // do something
  // Here, please put your script.

  if (e && "triggerUid" in e && e.triggerUid != "") {
    Drive.Files.update({properties: [
      {key: "processStatus", value: "COMPLETED", visibility: "PUBLIC"},
      {key: "processStartTime", value: "", visibility: "PUBLIC"},
    ]}, fileId);
  }
}

Пример сценария 2:

Этот сценарий используется для проверки того, выполняется ли сценарийуправляемый временем триггер. Пожалуйста, запустите этот скрипт для проверки. Вы также можете использовать этот скрипт, который не является тем же проектом, включая runByTrigger.

function myFunction() {
  var fileId = "###"; // Please set the file ID.

  var runningScript = Drive.Properties.get(fileId, "processStatus", {visibility: "PUBLIC"}).value;
  if (runningScript == "RUNNING") {
    var startTime = Drive.Properties.get(fileId, "processStartTime", {visibility: "PUBLIC"}).value;
    Logger.log("Script is currently running. Start time is %s", startTime)
  } else {
    Logger.log("Script was finished.")
  }
}
  • Оба fileId скрипта 1 и 2 имеют одинаковый идентификатор. В качестве тестового примера, если сценарий является автономным сценарием, укажите идентификатор сценария автономного сценария. Если сценарий является сценарием с привязкой к контейнеру, установите идентификатор файла в Документах Google.
  • Когда runByTrigger запускается с помощью запуска по времени, processStatus и processStartTime добавляются в свойствофайла.
    • Если в данный момент выполняется сценарий, при запуске функции myFunction в журнале отображается Script is currently running. Start time is {startTime}.
    • Если сценарий завершен и не запущен, в журнале отображается Script was finished..

Примечание:

  • В этом обходном пути, свойство файла используется. Но я думаю, что, например, статус процесса можно также сохранить в электронной таблице и т. Д.

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...