Google Sheet Script возвращает #NAME? - PullRequest
0 голосов
/ 12 июля 2019

Я настроил скрипт для извлечения данных из JSON API в Google Sheet.Я установил его для обновления, добавив третий параметр, который не используется в вызове API, но связан с ячейкой, к которой другой скрипт добавляет текущее время.Это гарантирует, что API вызывается регулярно.

Затем мы используем этот лист Google для ввода данных в объявления Google.

Однако все работает нормально, когда лист закрывается на некоторое время (например, на ночь) и GoogleРеклама пытается обновить с листа, она импортирует #NAME?вместо правильного значения API.

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

// Make a POST request with a JSON payload.
// Datetime parameter isn't use in API call but is used to refresh data

function TheLottAPI(game,attribute,datetime) {

var data = {
  'CompanyId': 'GoldenCasket',
  'MaxDrawCount': 1,
  'OptionalProductFilter': [game]};

    Logger.log(data);  

var options = {
  'method' : 'post',
  'contentType': 'application/json',
  // Convert the JavaScript object to a JSON string.
  'payload' : JSON.stringify(data)};

  var response = UrlFetchApp.fetch('https://data.api.thelott.com/sales/vmax/web/data/lotto/opendraws', options);

  Logger.log('output: '+ response);          

  // Convert JSON response into list
  var json = JSON.parse(response)
 var drawList=json ["Draws"];

  // Extract attribute from list
 for(var i=0;i<drawList.length;i++)
{var value=drawList[i][attribute];} 
  Logger.log(value)

  return value;
  SpreadsheetApp.flush();
};


// Set date & time to refresh API call

function RefreshTime() {
  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Attributes").getRange("K4").setValue(new Date().toTimeString());
}

Должны отображаться правильные числовые значения из API, а не #NAME?ошибка.

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

 function RecordDraws() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Draw Amounts");
  var source = sheet.getRange("A3:D3");
  var values = source.getValues();

  values[0];
  sheet.appendRow(values[0]);
  };

Ответы [ 2 ]

0 голосов
/ 12 июля 2019

Попробуйте преобразовать это

 SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Attributes").getRange("K4").setValue(new Date().toTimeString());

В это:

 SpreadsheetApp.openById("id").getSheetByName("Attributes").getRange("K4").setValue(new Date().toTimeString());

Поскольку я не думаю, что существует "активный лист", когда электронная таблица закрыта или метод вызваниз API.

0 голосов
/ 12 июля 2019

Это мое предположение

Определения пользовательских функций Google Sheets загружаются при открытии электронной таблицы с помощью пользовательского интерфейса Google Sheets, затем рассчитываются формулы, и, поскольку пользовательские функции уже определены, они рассчитываются правильно.Если электронная таблица не открывается таким образом, определения пользовательских функций не загружаются, поэтому электронная таблица не знает, что делать с этой функцией, и возвращает #NAME?

Если вы уже запускаете скрипт, который обновляетнекоторые значения улучшают этот скрипт для выполнения вычислений, выполняющих пользовательскую функцию.

...