Сохраните файл json / csv (полученный из API) в документ электронной таблицы, не используя al oop - Google Apps Script - PullRequest
0 голосов
/ 07 апреля 2020

Я могу получить данные, используя два разных URL, в зависимости от того, хочу ли я сохранить файл в формате csv или json.

  1. CSV edition

В случае csv url я делаю следующее:

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("data")

get_url="https://opendata.rdw.nl/resource/m9d7-ebf2.csv? 
    datum_tenaamstelling=20200404%20&$limit=20000";

  var result_data = UrlFetchApp.fetch(get_url);
  var raw_data = result_data.getContentText()
  Logger.log(raw_data);

В результате получается строка, которую я не могу сохранить в файле электронной таблицы без использования al oop.

JSON edition

Используя json url, я делаю следующее:

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("data")

get_url="https://opendata.rdw.nl/resource/m9d7-ebf2.json? 
datum_tenaamstelling=20200404%20&$limit=20000";

var result_data = UrlFetchApp.fetch(get_url, options);
var raw_data = result_data.getContentText()
var json_list = JSON.parse(raw_data)

 for(var i = 0; i < json_list.length; i++) {
    var obj = json_list[i];

    Logger.log(obj.merk);

    sheet.appendRow([obj.kenteken, 
                     obj.merk, 
                     obj.catalogusprijs, 
                     obj.datum_eerste_afgifte_nederland,
                     obj.datum_eerste_toelating,
                     obj.datum_tenaamstelling
                    ]);
}

Что снова я использую итерация, которая не практична, если я хочу сохранить 20000 строк в таблице. Через некоторое время он останавливается и возвращает ошибку времени выполнения.

Можно ли каким-либо образом напрямую скопировать данные в файл электронной таблицы? Например, чтобы сделать что-то подобное:

sheet.getRange(1, 1,raw_data.length,raw_data[0].length).setValues(raw_data);

Большое спасибо, и если мой вопрос неясен, дайте мне знать, и я проясню это для вас.

1 Ответ

0 голосов
/ 07 апреля 2020

Как сохранить спецификацию c из JSON ответа объекта

  • Цикл по всем данным и вызов метода sheet.appendRow() во время каждой итерации действительно будет медленным и неэффективным из-за числа вызовов - см. Рекомендации по использованию скрипта приложений .
  • Значительно более эффективный способ сделать это - создать массив для хранения данных, представляющих интерес, прежде чем записывать их один раз с помощью setValues().
  • Образец ниже по-прежнему включает for l oop, однако, учитывая, что во время каждой итерации не было обращений к внешним службам, весь сценарий выполнялся и записывал только 12 с, 12582 строки данных на лист.

Образец:

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("data")  
  get_url="https://opendata.rdw.nl/resource/m9d7-ebf2.json?datum_tenaamstelling=20200404%20&$limit=20000"; 
  var result_data = UrlFetchApp.fetch(get_url);
  var raw_data = result_data.getContentText()
  var json_list = JSON.parse(raw_data)
  var array = [];
  for(var i = 0; i < json_list.length; i++) {
    var obj = json_list[i];
    array.push([obj.kenteken, 
                obj.merk, 
                obj.catalogusprijs, 
                obj.datum_eerste_afgifte_nederland,
                obj.datum_eerste_toelating,
                obj.datum_tenaamstelling
               ]);
  }
  sheet.getRange(1, 1,array.length,array[0].length).setValues(array);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...