#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 Спасибо, что ответили. Из вашего ответа я предложил еще один пример сценария. Не могли бы вы, пожалуйста, подтвердить это? Если я неправильно понял вашу цель, я приношу свои извинения.