сохраните данные из ответа API для использования сценария приложения it

#javascript #google-apps-script #google-sheets

Вопрос:

Я использую скрипт приложения для получения данных из API, чтобы поместить их в Google лист. Я использую одну конечную точку API для получения большого количества информации, пример ответа: {"name": "john", "age": "24", "gender": "male", "price": "10",} .

Это мой код для получения каждого значения :

 function getName() {

       var url = "*****************";
       var apiRequest = UrlFetchApp.fetch(url);
       var jsonResponce = JSON.parse(apiRequest);
       var name= jsonResponce.name;
       return name;
  }
 

Я добавляю эту функцию в ячейку вот так getName() и возвращаю мне значение.

Поэтому я делаю так в 4 значениях : имя, возраст, пол и цена, с помощью одного API и нескольких функций, как указано вышеamp; getName() getAge() amp; getGender() amp; getPrice() . каждая функция помещается в другую ячейку, чтобы получить значение.

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

Ответ №1:

Вызовите его один раз и сохраните в глобальной переменной apiResponse . Используйте функцию для возврата желаемых значений из ответа на запрос:

 var url = "*****************";
var apiRequest = UrlFetchApp.fetch(url);
var apiResponse = JSON.parse(apiRequest);

function getValue(key) {
  return apiResponse[key]
}
 

Теперь в вашем листе Google просто добавьте =getValue("name") ячейку, чтобы получить имя.

Комментарии:

1. Этот метод вызывает API каждой функции, используя, например : =getValue("name") ИЛИ =getValue("age") ….. Я имею в виду, что нужно сохранить его в другом месте, не на листе, а после запуска =getValue("name") ИЛИ =getValue("age") не вызывать API.

2. И после запуска API основного запроса другая функция получает значение из API основного запроса

3. Именно это он и делает. API вызывается только один раз, и результат сохраняется в глобальной переменной. Когда вы вызываете GetValue(), вы получаете только значение из переменной, вы больше не вызываете API. Но здесь не место преподавать абсолютные основы программирования в целом. То, что я опубликовал в качестве ответа, работает, например, по вашему примеру. Я проверил это с помощью Google листов. Если ваши данные более сложны, например, вложенный объект, вам нужно сделать больше. Но это не было частью вопроса. Пожалуйста, проверьте, работает ли он, и если нет лучшего ответа, не забудьте принять его.

Ответ №2:

Я считаю, что ваша цель заключается в следующем.

  • Вы хотите получить значения name , age , gender , и price одним вызовом API и поместить их в электронную таблицу.
  • Вы хотите добиться этого с помощью пользовательской функции.

В этом случае, как насчет следующего примера сценария? Из вашего вопроса я понял, что возвращаемое значение равно {"name": "john", "age": "24", "gender": "male", "price": "10",} . В этом случае следующий сценарий возвращает нужные вам значения.

 function sample() {
  var jsonResponce = {"name": "john", "age": "24", "gender": "male", "price": "10"};
  const keys = ["name", "age", "gender", "price"]; // You can set the order of output values here.
  return [keys.map(k => jsonResponce[k])];
}
 

Когда приведенный выше сценарий будет отражен в вашем сценарии, он станет следующим.

Пример сценария:

 function sample() {
  var url = "*****************";
  var apiRequest = UrlFetchApp.fetch(url);
  var jsonResponce = JSON.parse(apiRequest.getContentText());
  const keys = ["name", "age", "gender", "price"]; // You can set the order of output values here.
  return [keys.map(k => jsonResponce[k])];
}
 
  • Когда вы помещаете =sample() в ячейку, каждое значение помещается в строку. Если вы хотите поместить значения в столбец, пожалуйста, измените return [keys.map(k => jsonResponce[k])]; значение на return keys.map(k => jsonResponce[k]) .

Примечание:

  • Если вы не используете среду выполнения V8, пожалуйста, измените ее следующим образом.
       var keys = ["name", "age", "gender", "price"]; // You can set the order of output values here.
      return [keys.map(function(k) {return jsonResponce[k]})];
     

Рекомендации:

Редактировать:

Из следующего ответа,

Этот метод работает, если вам нужно расположить его горизонтально или вертикально, ничего не меняя в этих значениях. но через некоторое время мне нужно вычислить какое-то значение по другому значению в другой ячейке или добавить строку в значение, например имя»amp;». причина в том, чтобы просто запустить одну функцию, чтобы получить значения из API и сохранить их в той же функции, эта функция выполняется каждую минуту или меньше, а затем другая функция получает значение из основной функции без запуска API.

Я понял, что вы хотели использовать пользовательскую функцию, например =sample("name") , в то время как вы хотели запросить API одним вызовом. А именно, вы хотели сохранить данные из API и хотели использовать данные с помощью пользовательской функции.

В этом случае, как насчет следующего примера сценария?

Пример сценария:

В этом примере сценария сначала данные сохраняются в службе свойств путем запуска сценария storeData() . И, когда вы помещаете пользовательскую функцию, например =sample("name") , в ячейку, вы можете использовать данные, полученные из службы свойств. В этом случае запрос API выполняется только один раз.

Если вы хотите обновить данные, пожалуйста, запустите эту функцию storeData() . Таким образом, данные обновляются. Например, когда кнопка с изображением помещается в электронную таблицу, вы также можете запустить функцию, нажав на кнопку.

 // Store the data to Properties service.
function storeData() {
  var url = "*****************";
  var apiRequest = UrlFetchApp.fetch(url);
  var jsonResponce = apiRequest.getContentText();
  PropertiesService.getScriptProperties().setProperty("data", jsonResponce);
  console.log("Stored at "   new Date());
}

// Custom function.
function sample(key) {
  var str = PropertiesService.getScriptProperties().getProperty("data");
  var obj = JSON.parse(str);
  return obj[key] || "None"; 
}
 

Ссылка:

Комментарии:

1. Этот метод работает, если вам нужно расположить его горизонтально или вертикально, ничего не меняя в этих значениях. но некоторое время мне нужно вычислить какое-то значение по другому значению в другой ячейке или добавить строку в значение, например "amp;"name . причина в том, чтобы просто запустить одну функцию, чтобы получить значения из API и сохранить их в той же функции, эта функция выполняется каждую минуту или меньше, а затем другая функция получает значение из основной функции без запуска API.

2. @johnvan Спасибо, что ответили. Из вашего ответа я предложил еще один пример сценария. Не могли бы вы, пожалуйста, подтвердить это? Если я неправильно понял вашу цель, я приношу свои извинения.