При использовании Sheets API с помощью пользовательской функции, например =myFunction()
, помещаемой в ячейку, возникает такая ошибка. Когда пользовательская функция запущена, ScriptApp.getOAuthToken()
возвращает null
. Я думаю, что это в основном причина вашей проблемы. И, к сожалению, я думаю, что это спецификация. Чтобы избежать этой проблемы, я хотел бы предложить 2 обходных пути.
Обходной путь 1:
Часть Spreadsheet Services может использоваться в пользовательской функции. Таким образом, используя это, он получает тот же результат с var values = Sheets.Spreadsheets.Values.get(spreadsheetId, rangeName).values;
. В случае вашего сценария, openById()
не может быть использован. Итак, сценарий выглядит следующим образом.
Пример сценария:
function customFunc() {
var rangeName = "#####"; // Please set this.
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var values = sheet.getRange(rangeName).getValues();
return values;
}
Обходной путь 2:
Если вы хотите использовать Sheets API, необходим токен доступа. Но требуется прямой запрос к конечной точке Sheets API, потому что токен доступа автоматически используется во внутренних службах Advanced Google Services. Проблема этого случая заключается в том, что при запуске ScriptApp.getOAuthToken()
в пользовательской функции возвращается null
. Чтобы избежать этого, в качестве метода токен доступа напрямую передается пользовательской функции с помощью PropertiesService. Поток пробы выглядит следующим образом.
- При открытии электронной таблицы токен доступа помещается в PropertiesService с помощью триггера OnOpen.
- Когда вы используете это, пожалуйста, установите триггер OnOpen на
onOpenFunc()
в примере скрипта.
- Когда пользовательская функция запущена, токен доступа, полученный PropertiesService, используется для использования Sheets API.
Таким образом, Sheets API может использоваться в пользовательской функции.
Пример сценария:
// Please install OnOpen trigger to this function.
function onOpenFunc() {
PropertiesService.getScriptProperties().setProperty("accessToken", ScriptApp.getOAuthToken());
}
function customFunc() {
var spreadsheetId = "#####"; // Please set this.
var rangeName = "#####"; // Please set this.
var accessToken = PropertiesService.getScriptProperties().getProperty("accessToken");
var url = "https://sheets.googleapis.com/v4/spreadsheets/" + spreadsheetId + "/values/" + rangeName;
var res = UrlFetchApp.fetch(url, {headers: {"Authorization": "Bearer " + accessToken}});
var obj = JSON.parse(res.getContentText());
var values = obj.values;
return values;
}
- Время истечения срока действия токена доступа составляет 1 час. В этом примере сценария используется PropertiesService. В этом случае, если после открытия электронной таблицы тратится 1 час, токен доступа не может быть использован. Если вы хотите постоянно использовать токен доступа, вы также можете обновить его, используя управляемый по времени триггер.
Примечание:
- Когда вы используете Sheets API, включите Sheets API на консоли API.
Ссылки
Если эти обходные пути не соответствуют вашим ожиданиям, я прошу прощения.