На своей недавней конференции I/O Google представила ряд новых обновлений к набору сценариев для Google Apps, который позволяет создавать макросы, весьма похожие на те, что служат для расширения приложений Microsoft Office. В случае Google, однако, эти скрипты выполняются на сервере (т. е. на серверах Google) и используют JavaScript (на стороне сервера).
Когда примерно год назад сценарии для Google Apps были представлены впервые, они был доступны только премиум-членам сообщества разработчиков. Затем в январе Google открыл доступ к большинству функций для обычных клиентов. Сюда вошли классы для доступа к списку контактов и папкам и классы для манипулирования электронными таблицами вплоть до уровня ячеек (т. е. аналогично тому, что вы имеете в соответствующем приложении для ПК).
Затем в мае Google добавил ряд обновлений: поддержку интеграции с базой данных через JDBC (Java Database Connectivity), специальный пользовательский интерфейс (зарезервированный для платной Premier-версии Apps), автономный запуск скриптов (позволяющий запускать их с других веб-сайтов помимо Google), дополнительную интеграцию в свойства Google, такие как список Documents и Google Maps, и устанавливаемые обработчики событий.
На текущий момент система создания скриптов доступна главным образом из приложения электронных таблиц, хотя она интегрирована и в другие приложения Google, в частности в системы электронной почты и карты. В систему скриптов включен “насыщенный” API с объектами, которые позволяют вам автоматизировать почти любое задание, какое только можно представить.
Google опубликовал также примеры: один позволяет имитировать стратегию продажи акций в приложении электронных таблиц, другой генерирует фракталы, а еще один представляет собой полную систему записи учебного курса. (Этот третий кажется здесь лишним. Я не могу представить, чтобы кто-то стал использовать онлайн-программу электронных таблиц в качестве системы записи курса, однако это демонстрирует широту спектра того, что можно делать.)
Лично я всё еще отношусь к этим новшествам немного скептически. Конечно, здесь есть некоторые полезные вещи, но я не уверен, насколько популярной будет такая система скриптов. Что касается JDBC, то это здорово: вы сможете создавать вполне приличные приложения поверх системы электронных таблиц.
Подобная функциональность существовала в Microsoft Excel уже давно, но многие ли реально создавали приложения в Excel по сравнению с огромным количеством тех, кто просто использует эту программу и ее базовые функции? Возможно, всё изменится и система скриптов для Google Apps действительно имеет ряд интересных функций. Остается лишь посмотреть, станет ли она популярной.
Интеграция через JDBC
Если вы знакомы с JDBC из мира Java, то почувствуете себя как дома с интеграцией через JDBC. Набор классов меньше, чем официальный Sun JDBC API, работающий под Java (я имею здесь в виду JavaScript, а не Java; это совсем разные вещи), но базовая функциональность обеспечена через классы для поддержки соединений, операторов, подготовленных операторов и результирующих множеств.
Документация по API скудновата: она содержит прототипы функций и краткие описания, но никаких примеров. Скажем, я хотел увидеть какой-либо реальный SQL в классе JdbcStatement, но там ничего не было. Я надеюсь, что появится более подробная документация в будущем, а также больше примеров от сообщества.
Система скриптов это по сути упаковщик JavaScript для набора Java-классов на сервере. Почему я так решил? Потому что при тестировании я часто получал сообщения об ошибках, которые явно приходили от Java. Один раз я попытался превратить массив JavaScript в функцию и получил сообщение об ошибке: “Cannot convert NativeArray@78037b60 to java.lang.Object[][]”.)
Далее, JavaScript-классы, с которыми вы взаимодействуете, похоже, имеют множество методов, которые не документированы в API. Это нормально, если учесть, что в JavaScript почти нет механизма для общедоступных и индивидуальных членов класса. Есть способы скрывать члены, тем самым делая их индивидуальными, но сама спецификация не поддерживает уровни доступа.
Однако это означает, что вы имеете уйму функций, которые легко можете вызывать (хотя следует быть осторожным, если они не документированы, поскольку Google может легко изменить их в любой момент). Откуда я узнал это? Увидел, что редактор скриптов знает объекты и показывает список членов, доступных для объекта, как только вы напечатаете имя объекта с точкой.
Конечно, JavaScript не силён в типах: вы просто объявляете переменные с помощью var, и они могут быть любого типа. Это означает, что редактор кода выполняет довольно сложную работу, чтобы проследить цепочку вызовов. Например, если вы напечатаете
var ss = SpreadsheetApp.getActiveSpreadsheet();
то редактор знает, что метод getActiveSpreadsheet возвращает объект Spreadsheet, или, более точно для пуристов JavaScript, объект, который содержит члены, определяющие его как объект Spreadsheet.
Код соединения
Исполнение кода было несколько медленным; потребовалось где-то 4 с для соединения, и затем можно было воочию видеть заполнение строки, потом крошечную паузу, потом заполнение следующей строки и т. д. Сравните это с удаленным соединением через интерфейс командной строки mysql (с моего локального компьютера с тем же удаленным сервером mysql), который соединился мгновенно и извлекал строки чуть быстрее.
Трудно сказать, в чем задержка на стороне Google, но я мог бы предложить провести несколько тестов и проверить, достаточно ли быстрый доступ для ваших целей. Если нет, то можно попытаться что-то ускорить: например, использовать хранимые процедуры и виды на стороне базы данных.
В официальном блоге сказано: “Теперь есть возможность вызывать скрипт с любого веб-сайта, так что вы можете создавать веб-страницы, где пользователи смогут вводить данные, которые будут собираться в электронную таблицу Google”. К сожалению, это почти вся информация, какую мы имеем на текущий момент. В документации пока ничего нет об этой функции, но звучит многообещающе.
Мне представляется, что будет добавлена библиотека JavaScript, которую вы включите на своем веб-сайте, чтобы получать доступ к скриптам, почти так же, как вы можете включать скрипты Facebook на собственном сайте. Остается подождать и посмотреть. Вопросы приватности и безопасности также вызывают интерес.
Скрипты Google Apps могут выполняться из отдельных приложений, например электронных таблиц Google, и обращаться к данным, хранимым в других приложениях Google
Открытие JDBC-соединения
Поскольку документация была скудновата, мне пришлось самому разбираться, как заставить JDBC-соединение работать. Но когда я в этом разобрался, то всё заработало очень хорошо. Для читающих это программистов привожу краткий фрагмент кода, который открывает JDBC-соединение, выполняет некий SQL-запрос и копирует полученные данные в активную электронную таблицу:
function testJDBC() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var connstr = 'jdbc:mysql://www.example.com:3306/test'; // subst your own IP/database name.
var conn = Jdbc.getConnection(connstr, 'username', 'password');
var stmt = conn.createStatement();
stmt.execute('sel ect * fr om names');
var res = stmt.getResultSet();
var line = 2;
var stuff;
while (res.next()) {
var fname = res.getString('fname');
var lname = res.getString('lname');
sheet.getRange('A' + String(line) +':B' + String(line)).setValues([[fname,lname]]);
line++;
}
conn.close();
}