У меня есть веб-приложение Google Apps Script («Веб-приложение»), которое выполняется от имени пользователя, затем вызывает отдельные функции из другого проекта Apps Script («Исполняемый файл API») через API-интерфейс скрипта Apps, используя UrlFetchApp.fetch()
, и выполняет их. как я (см. Получение информации о пользователе, когда кто-то запускает веб-приложение Google Apps Script от имени меня ).
Ограничением этого метода является то, что UrlFetchApp.fetch()
имеет время ожидания 60 с, и один из моих функции часто занимает больше времени, чем это. Исполняемая функция API завершается успешно, но веб-приложение выдает исключение тайм-аута. Я хотел бы обработать это исключение, запустив вторую функцию «отслеживания», которая находит и возвращает URL-адрес листа Google, успешно созданного исходной функцией. Тем не менее, мне нужно передать последующую функцию одному из параметров, переданных исходной функции, и, похоже, я не могу сделать это в стандартном блоке try ... catch.
Моя идея должен был сгенерировать исключение, которое содержит необходимый параметр, но я не могу понять, как сгенерировать свое собственное исключение тайм-аута; Поскольку Google Apps Script работает синхронно, нет способа отследить, сколько времени UrlFetchApp.fetch()
работает , пока работает .
Есть ли способ вызвать ваше собственное исключение тайм-аута? Или есть ли другой способ передать необходимый параметр в функцию, которая запускается, если произошла ошибка тайм-аута?
Я также пометил Javascript в этом посте, так как есть много совпадений с Google Apps Script и Я рассчитывал, что это улучшит мои шансы на общение с кем-то, у кого есть ответ - надеюсь, что все в порядке. Ниже приведена функция, которую я использую в своем веб-приложении для вызова исполняемых функций API, в случае, если это полезно.
РЕДАКТИРОВАТЬ: На основании комментария @ TheMaster я решил написать скрипт, как если бы параметры передавались executeAsMe()
БЫЛ передан в блок catch()
, чтобы посмотреть, что произошло. Я ожидал исключения относительно того факта, что opt_timeoutFunction
был неопределен, но странным образом кажется, что только первая строка блока catch()
работает, и я не уверен, почему.
function executeAsMe(functionName, paramsArray, opt_timeoutFunction, opt_timeoutParams) {
try {
console.log('Using Apps Script API to call function ' + functionName.toString() + ' with parameter(s) ' + paramsArray.toString());
var url = 'https://script.googleapis.com/v1/scripts/Mq71nLXJPX95eVDFPW2DJzcB61X_XfA8E:run';
var payload = JSON.stringify({"function": functionName, "parameters": paramsArray, "devMode": true})
var params = {method:"POST",
headers: {Authorization: 'Bearer ' + getAppsScriptService().getAccessToken()},
payload:payload,
contentType:"application/json",
muteHttpExceptions:true};
var results = UrlFetchApp.fetch(url, params);
var jsonResponse = JSON.parse(results).response;
if (jsonResponse == undefined) {
var jsonResults = undefined;
} else {
var jsonResults = jsonResponse.result;
}
} catch(error) {
console.log('error = ' + error); // I'm seeing this in the logs...
console.log('error.indexOf("Timeout") = ' + error.indexOf("Timeout").toString); // ...but not this. It skips straight to the finally block
if (error.indexOf('Timeout') > 0) { // If error is a timeout error, call follow-up function
console.log('Using Apps Script API to call follow-up function ' + opt_timeoutFunction.toString() + ' with parameter(s) ' + paramsArray.toString());
var url = 'https://script.googleapis.com/v1/scripts/Mq71nLXJPX95eVDFPW2DJzcB61X_XfA8E:run';
var payload = JSON.stringify({"function": opt_timeoutFunction, "parameters": opt_timeoutParams, "devMode": true})
var params = {method:"POST",
headers: {Authorization: 'Bearer ' + getAppsScriptService().getAccessToken()},
payload:payload,
contentType:"application/json",
muteHttpExceptions:true};
var results = UrlFetchApp.fetch(url, params);
var jsonResponse = JSON.parse(results).response;
if (jsonResponse == undefined) {
var jsonResults = undefined;
} else {
var jsonResults = jsonResponse.result;
}
}
} finally {
console.log('jsonResults = ' + jsonResults);
return jsonResults;
}
}