В запросе отсутствует действительный ключ API - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь использовать API Google Sheets.Проблема заключается в том, что, как только я вызываю функцию скрипта в электронной таблице Google, я получаю следующую ошибку:

API-вызов Sheets.spreadsheets.values.get завершился ошибкой: в запросе отсутствует действительныйКлюч API.(строка 5).

, где строка 5 в скрипте выглядит следующим образом:

var values = Sheets.Spreadsheets.Values.get(spreadsheetId, rangeName).values;

и spreadsheetId и rangeName определены в первых строках.Я думаю, что проблема может заключаться в том, что я нигде не копировал ключ API, но я действительно не понимаю, где и как я могу это сделать.

Я вызываю функцию, просто делая = function ().Это неправильно?

1 Ответ

2 голосов
/ 12 марта 2019

При использовании 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. Поток пробы выглядит следующим образом.

  1. При открытии электронной таблицы токен доступа помещается в PropertiesService с помощью триггера OnOpen.
    • Когда вы используете это, пожалуйста, установите триггер OnOpen на onOpenFunc() в примере скрипта.
  2. Когда пользовательская функция запущена, токен доступа, полученный 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.

Ссылки

Если эти обходные пути не соответствуют вашим ожиданиям, я прошу прощения.

...