Передача ключа API для импорта JSON Функциональный скрипт для Google Sheets - PullRequest
1 голос
/ 13 января 2020

Я пытаюсь импортировать данные из WordsAPI , используя import JSON, пользовательскую функцию скрипта Google в Google Sheets из Github. Легко импортировать информацию из API, который не требует аутентификации. Однако для WordsAPI требуется ключ, и я не могу понять, как передать ключ в функцию. Мое лучшее предположение:

=ImportJSONAdvanced("https://wordsapiv1.p.mashape.com/words/example/examples", "wordsapiv1.p.rapidapi.com", "<MYKEYHERE>", "/examples/", "noInherit,noTruncate,Headers")

Но это приводит к ошибке: Bad value (line 220).

Соответствующий раздел кода приведен ниже. Go в Импорт JSON .gs в Github для получения полного кода.

function ImportJSONAdvanced(url, fetchOptions, query, parseOptions, includeFunc, transformFunc) {
  var jsondata = UrlFetchApp.fetch(url, fetchOptions);
  var object   = JSON.parse(jsondata.getContentText());

  return parseJSONObject_(object, query, parseOptions, includeFunc, transformFunc);
}

Я прочитал документацию относительно аутентификации на сайте WordsAPI и они предлагают следующий фрагмент кода:

// These code snippets use an open-source library. http://unirest.io/nodejs
unirest.get("https://wordsapiv1.p.mashape.com/words/soliloquy")
.header("X-Mashape-Key", "<MYKEYHERE>")
.header("Accept", "application/json")
.end(function (result) {
  console.log(result.status, result.headers, result.body);
});

Я также прочитал документацию скрипта Служб Google по вопросам авторизации для служб Google , но для меня это мало что значит , Возможно ли проблема в том, что ImportJSONAdvanced использует POST и WordsAPI хочет получить? Если это так, как я могу изменить код, чтобы он работал?

Спасибо за чтение. Любая помощь будет очень высоко ценится.


Редактировать: на основе комментариев @chuckx и дополнительной помощи. Я добавил следующее в строке 255 к исходному коду .

/**
 *
 * Wrapper for WordsAPI
 *
 * @param {url} the URL to a http basic auth protected JSON feed
 * @param {api_key} the api_key for authentication
 * @param {query} always = ""
 * @param {parseOptions} a comma-separated list of options that may alter processing of the data (optional)
 */
function ImportJSON_words(url, api_key, query, parseOptions) {
  var header = {
    headers: {
      'X-Mashape-Key': api_key,
      'Accept': 'application/json'
    }
  }
  return ImportJSONAdvanced(url, header, query, parseOptions, includeXPath_, defaultTransform_)
}

Работает.

1 Ответ

2 голосов
/ 13 января 2020

Прежде всего, обратите внимание, что документация прямо заявляет , что ImportJSONAdvanced() не может быть вызван из электронной таблицы (то есть как формула в ячейке):

 * An advanced version of ImportJSON designed to be easily extended by a script. This version cannot be called from within a 
 * spreadsheet.

Кроме того, аргументы, которые вы указываете в своих лучших предположениях, не совпадают с документацией аргументов для ImportJSONAdvanced(). Для справки:

 * @param {url}           the URL to a public JSON feed
 * @param {fetchOptions}  an object whose properties are options used to retrieve the JSON feed from the URL
 * @param {query}         the query passed to the include function
 * @param {parseOptions}  a comma-separated list of options that may alter processing of the data
 * @param {includeFunc}   a function with the signature func(query, path, options) that returns true if the data element at the given path
 *                        should be included or false otherwise. 
 * @param {transformFunc} a function with the signature func(data, row, column, options) where data is a 2-dimensional array of the data 
 *                        and row & column are the current row and column being processed. Any return value is ignored. Note that row 0 
 *                        contains the headers for the data, so test for row==0 to process headers only.

Интерес представляет аргумент fetchOptions, который передается в UrlFetchAPP.fetch(url, params) в качестве аргумента params. Согласно документации , params - это объект, который может содержать параметр headers, который можно использовать для установки заголовков для HTTP-запроса.

Итак, один из подходов определение вашей собственной функции скрипта приложения, которая обертывает ImportJSONAdvanced() и подготавливает требуемый заголовок.

function ImportJSON_WordsAPI(path, query, parseOptions) {
  var url = 'https://wordsapiv1.p.mashape.com/words' + path;
  var fetchOptions = {
       'headers': {
           'X-Mashape-Key': '<MYKEYHERE>',
           'Accept': 'application/json',
       },
  }
  return ImportJSONAdvanced(url, fetchOptions, query, parseOptions, includeXPath_, defaultTransform_);
}

И затем используйте функцию в такой ячейке:

=ImportJSON_WordsAPI('/words/soliloquy', '/results', 'noInherit,noTruncate')

Предупреждение: нет это проверено, так как у меня нет доступа к WordsAPI.

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