9 февр. 2011 г.

Импорт JSON в Google Spreadsheets

В предыдущем посте я описал как пользоваться встроенной в Google Spreadsheets поддержкой импорта данных из XML (а также упомянул, что есть поддержка CSV, TSV, HTML, RSS и ATOM).

С JSON всё несколько хуже, но данные тоже вполне можно импортировать — просто придётся написать несколько строк кода.

Данные у меня такие:
  {
"result": {
"item": [
{
"id": 1,
"stime": 1291680000,
"value": 29699
},
{
"id": 2,
"stime": 1291690000,
"value": 30281
},
]
}
}
В данном случае мне не нужно было загружать данные через интернет, наоборот, пользователь должен получать этот JSON хитрым способом и вставлять этот его в таблицу руками.

Google Spreadsheets можно писать скрипты на JavaScript. Этим мы и воспользуемся чтобы их загрузить.

Создаём новую таблицу. Идём в меню Инструменты | Скрипты | Редактор скриптов.

Добавляем такой скрипт:
function convertJSON2Table() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var data = sheet.getRange(2, 1, 1, 1).getValue();
if (data == "")
{
sheet.getRange(
2, 1, 1, 1
).setValue(
"PASTE JSON DUMP HERE"
);
return;
}

var obj = Utilities.jsonParse(data);
if (!obj.result || !obj.result.item)
{
sheet.getRange(
1, 1, 1, 1
).setValue(
"BAD DATA FORMAT"
);
return;
}

sheet.clear();

obj = obj.result.item;

var col = 1
for (var k in obj[1])
{
sheet.getRange(1, col++).setValue(k)
}

var line = 2
for (var i in obj)
{
var entry = obj[i];
var col = 1;
for (var k in entry)
{
var val = entry[k];
if (k == "stime")
{
val = new Date(val * 1000);
}
sheet.getRange(
line, col++
).setValue(val);
}
++line;
}
}
Вставляем данные в ячейку A2 первого листа.

Выбираем в меню Инструменты | Скрипты | Управление. Выбираем "convertJSON2Table", жмём Run.

Вуаля, наш JSON превратился в табличные данные.

У меня не было много времени для того, чтобы возиться со скриптом и делать всё красиво. Так что в реализации присутствуют некрасивые хаки (тот же способ ввода данных, например) — но она, по крайней мере, работает.

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