- Вы хотите знать, выполняется ли сейчас сценарий по управляемому временем триггеру.
- Вы хотите добиться этого с помощью скрипта 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.
.
Примечание:
- В этом обходном пути, свойство файла используется. Но я думаю, что, например, статус процесса можно также сохранить в электронной таблице и т. Д.
Ссылки: