Обратите внимание, что новости можно получать по RSS.
X
-

Информационные технологии, LiveJournal cr_it - архив

21 октября 2011, 07:29 (2225 дней назад, №8816)Google Spreadsheets - серверная часть для Javascript клиента

Бывает так, что для web проекта на JS/HTML необходима простая база данных с интерфейсом, который позволял бы обычному пользователю добавлять и редактировать записи.  В ряде случаев можно обойтись без создания серверной части и всяких форм ввода, воспользовавшись Google Spreadsheets API .

Создаём таблицу. Делаем Share / Anyone with link , затем File / Publish to the Web.

Выбираем лист (обычно Sheet1). В разделе Get a link to the published data выбираем ATOM (этот пункт есть только для обычных гуглоаккаунтов. Для Google Apps аккаунтов его почему-то пока нет).
Внизу появляется ссылка на  Atom feed для данной таблицы, выглядит примерно так:


https://spreadsheets.google.com/feeds/list/1As7ltzfMZnqJdEVoaEFCVXlHaGlWVnR0YUxjNWhEN3c/od6/public/basic?hl=en_US

Нас интересуют здесь два параметра:
key = 1As7ltzfMZnqJdEVoaEFCVXlHaGlWVnR0YUxjNWhEN3c
workSheetId = od6

Нам нужен не xml, а json (причём, кроссдоменный).  
Допустим, мы хотим получать данные с разбивкой по ячейкам. Строка запроса будет выглядеть следующим образом:

http://spreadsheets.google.com/feeds/cells/1As7ltzfMZnqJdEVoaEFCVXlHaGlWVnR0YUxjNWhEN3c/od6/public/values?alt=json-in-script&callback=myFunc

Код:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Reading google spreadsheet data via API</title>
<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/io/script.js"></script>

<script>
dojo.ready(function()
{

// Fetching data from Google Spreadsheet (code by Frog)
function fetchData()
{
    var jsonpArgs =
    {
        url: 'http://spreadsheets.google.com/feeds/cells/1As7ltzfMZnqJdEVoaEFCVXlHaGlWVnR0YUxjNWhEN3c/od6/public/values?alt=json-in-script',
        callbackParamName: "callback",
        timeout: 5000,
        handleAs: 'json',
        load: function(response)
        {
            var html = '';
            console.log('fetchData response:', response);
            
            html += 'Получено данных в ячейках: ' + response.feed.openSearch$totalResults.$t + '<p>';
            html += 'Последнее обновление таблицы: ' + response.feed.updated.$t + '<p>';

            dojo.forEach(response.feed.entry, function(cell)
            {
                html +=    'Строка:' + cell.gs$cell.row + ' Столбец:' + cell.gs$cell.col + ' Содержимое: ' + cell.gs$cell.$t + '<br>';
            });//forEach
              
            dojo.byId('content').innerHTML = html;

        },//load

        error: function(error)
        {
            console.log('fetchData: An unexpected error occurred: ' + error);
        }//error

    };//jsonpArgs

    dojo.io.script.get(jsonpArgs);

}//fetchData()

fetchData();

});
</script>
</head>
<body>
<div id="content"></div>
</body>
</html>



Результат:

----------

Получено данных в ячейках: 8

Последнее обновление таблицы: 2011-10-21T02:59:35.293Z

Строка:1 Столбец:1 Содержимое: ячейка A1
Строка:1 Столбец:2 Содержимое: ячейка B1
Строка:2 Столбец:1 Содержимое: ячейка A2
Строка:2 Столбец:2 Содержимое: ячейка B2
Строка:3 Столбец:1 Содержимое: ячейка A3
Строка:3 Столбец:2 Содержимое: ячейка B3
Строка:4 Столбец:1 Содержимое: ячейка A4
Строка:4 Столбец:2 Содержимое: ячейка B4


------

Примечания:

1.Действия по изменению таблицы (insert/update/delete) в отличие от чтения требуют авторизацию и одним GET там не обойдешься.
2.Есть также ряд полезных параметров (сортировка, условия и пр.).

В принципе, подход можно развить довольно далеко. К примеру, Google Apps Scripts позволяет написать скрипты срабатывающие по определённым событиям, в том числе и по времени. Так что серверная часть может получится полезная, если не нужно менять данные с клиента.

Файлы непосредственно в таблицу поместить будет конечно проблематично, но ничто не мешает закачать их в Google Docs или Picasa/Youtube (взависимости от назначения), а в ячейки таблицы вставлять URL. Этот процесс, кстати, тоже можно автоматизировать, но для этого уже придётся попотеть.

Несколько туманен вопрос с количеством запросов в единицу времени, которое Google позволит делать по URL feed'a. В документации по этому поводу ничего не сказано, а в группе вопросы людей остаются без ответа. Вероятно это потому, что Google не хочет предоставлять какие-то гарантированные минимумы. Мораль простая - не стоит использовать это решение на проектах с большим числом запросов в секунду. Впрочем, жалобы на отказы по причине нагрузки редки, как я заметил.
В качестве меры предосторожности можно проверять, был ли изменён лист таблицы без получения данных таблицы (см. про If-None-Match header).

UPDATE: Обнаружил статью - человек делал тоже самое, только через Google Fusion Tables :)




Опубликовано: Пётр Соболев

Случайная заметка

6607 дней назад, 05:3122 октября 1999 Наверное многие, листая за чашкой чая статистику посещений своего сайта, обращали внимание на адрес ipaccess.gov.ru (а также различные .gov.ua, .gov.lv) и задавали себе вопрос - кто же это такой, загадочный. Между тем, достаточно легко составить общее представление как минимум о части тех, кто пользуется dialup'om в сети RGIN (администрируемой ...далее

Избранное

202 дня назад, 01:575 мая 2017 Часть 1: От четырёх до восьми Я люблю читать воспоминания людей, заставших первые шаги вычислительной техники в их стране. В них всегда есть какая-то романтика, причём какого она рода — сильно зависит от того, с каких компьютеров люди начали. Обычно это определяется обстоятельствами — местом работы, учёбы, а иногда и вовсе — ...далее

1707 дней назад, 00:5922 марта 2013 Прочёл тут книжку - iWoz ( ссылка ) , 2006 года. Это автобиография Стива Возняка. Похоже, что на русский её не переводили (в отличие от книг про Стива Джобса). В этой парочке, как известно, Возняк был инженером (собственно, и спроектировавшим Apple I и II), а Джобс - скорее предпринимателем. В книге есть довольно интересные ...далее

811 день назад, 23:404 сентября 2015 Небольшое видео про CC'2015 ( версия без фоновой музыки здесь: ссылка )

1179 дней назад, 03:121 сентября 2014 Мой семинар на Chaos Constructions'2014 (слайды можно в виде PDF скачать здесь: ссылка ) и несколько интервью с разными людьми: Вячеслав Славинский (svo) о Vectrex: ссылка Вячеслав Славинский (svo) о 3D Imager для Vectrex: ссылка Вячеслав Славинский (svo) о световом пере для Vectrex: ссылка ...далее