Google Apps API Japan キックオフミーティングの資料を公開します
もう一週間以上前になってしまいましたが、 Google Apps API Japan グループの立ち上げに伴うキックオフイベントで LT をしてきました。本日はその資料を公開します。ほんとはイベント終了後すぐに公開するべきだったのですが、本業が忙しくて時間が取れなかったのと、突貫工事で作ったサンプルプログラムにいくつか問題があって、その解決に時間がかかってしまいました。申し訳ありません m(_ _)m
プレゼン自体は以下の URL で閲覧できます。 Google のスライドテンプレートを使っているんですが、これは画面サイズが固定されるのがイマイチですね…。以前自分で作った奴に戻そうかな (^^;
http://webos-goodies.jp/attachments/apps_api_japan...
LT では簡単なデモをいくつか行ったので、以降にスクリーンショットと簡単な説明を書いておきます。
シンプルな Google ガジェット
「Google ガジェットについて」のところでソースを出しているのは、超初歩的な Hello World ガジェットです。一応、ユーザー設定でメッセージを変更できるようになっています。 iGoogle で表示するとこんな感じ。
Google ガジェットの開発方法の詳細については、公式のスタートガイドをご参照ください。
Gmail サイドバーガジェット
Gmail サイドバーガジェットの例として、 Twitgether をご紹介しました。 Gmail を Twitter クライアントにしてしまおうというガジェットです。
が、現在は CANVAS モードでのガジェットサイズの変更がうまく動いていないらしく、デベロッパーツールで無理やり IFRAME のサイズを変更するはめに orz 実行直後の gadgets.adjustHeight() は危険です。 1 秒くらい待ってから実行するのが無難だと思います。
Gmail コンテキストガジェット
メール中に含まれている PDF や SVG などのリンクをプレビューするガジェットをデモをしました。メール中に既定のファイルタイプ(単に拡張子で判定 ^^;)のリンクがあるとガジェットが表示され、メール本文の下にプレビューが表示されます。
ソースは以下のようになっています。
http://webos-goodies.jp/attachments/apps_api_japan...
http://webos-goodies.jp/attachments/apps_api_japan...
<?xml version="1.0" encoding="UTF-8" ?>
<Module>
<ModulePrefs title="Document Viewer" height="350" scrolling="false">
<Require feature="dynamic-height" />
<!-- 使用するExtractorのリスト -->
<Require feature="google.contentmatch">
<Param name="extractors">google.com:HttpLinkExtractor</Param>
</Require>
</ModulePrefs>
<Content type="html" view="card"><![CDATA[
<!DOCTYPE html>
<style type="text/css">
#files-outer { width:100%; overflow:hidden; }
#viewer { display:block; width:100%; height:300px;
border:none; padding:0; margin:0; }
</style>
<!-- ファイル選択コントロールを表示する場所 -->
<div id="files-outer"></div>
<!-- プレビューを表示するiframe -->
<iframe id="viewer" src="about:blank" frameborder="0"></iframe>
<script type="text/javascript">
gadgets.util.registerOnLoadHandler(function() {
// エクストラクタの出力を取得
var matches = google.contentmatch.getContentMatches();
// ファイルを選択するSELECT要素を生成
var selector = ['<select id="files">'];
for(var i = 0 ; i < matches.length ; ++i) {
var value = gadgets.util.escapeString(matches[i].url);
selector.push(
'<option value="' + value + '">' + value + '</option>');
}
selector.push('</select>')
document.getElementById('files-outer').innerHTML = selector.join('');
// SELECT要素のイベントを設定(同時にイベントハンドラを一回実行)
document.getElementById('files').onchange = changeFile;
changeFile();
// ガジェットの高さを調整
gadgets.window.adjustHeight();
});
function changeFile() {
var url = document.getElementById('files').value;
document.getElementById('viewer').src =
'https://docs.google.com/viewer?embedded=true&url=' +
encodeURIComponent(url);
}
</script>
]]></Content>
</Module>
Gmail コンテキストガジェットについては、こちらの記事をご参照ください。また、最近ではカスタム・エクストラクタも使えるようになっています。
Google カレンダー サイドバーガジェット
コンテキストガジェットと同様に、イベントの説明から PDF 等へのリンクを抽出してプレビューするガジェットをデモしました。イベントを選択すると、説明中のリンクがサイドバーに表示されます。
そして、リンクをクリックすると CANVAS ビューで内容が閲覧できます。 PDF 等は Google Docs Viewer で、それ以外は単純に IFRAME 埋め込みで表示します。
ソースは以下です。
http://webos-goodies.jp/attachments/apps_api_japan...
<?xml version="1.0" encoding="UTF-8" ?>
<Module>
<ModulePrefs title="Link Preview" height="1" scrolling="false">
<Require feature="dynamic-height" />
<Require feature="views" />
<Require feature="google.calendar-0.5" />
<Require feature="google.calendar-0.5.read" />
</ModulePrefs>
<Content type="html" view="home,profile"><![CDATA[
<!DOCTYPE html>
<style>
#content { font-size:12px; overflow:hidden; }
#content ul { margin-left: 2em; padding-left:0; white-space:pre; }
</style>
<div id="content" onclick="onClickContent(event); return false;"></div>
<script type="text/javascript">
// カレンダーイベント選択の監視を開始
gadgets.util.registerOnLoadHandler(function() {
google.calendar.read.subscribeToEvents(onSelectCalendarEvent);
});
// calendar.time を指定秒数だけずらす
function addTimeDelta(time, delta) {
return google.calendar.utils.fromDate(
google.calendar.utils.toDate(time, delta * 1000));
}
// カレンダーイベントが選択されたときに呼ばれる関数
function onSelectCalendarEvent(event) {
google.calendar.read.getEvents(
function(results) {
var ev = null;
for(var i = 0 ; i < results.length ; i++) {
var events = results[i].events;
for(var j = 0 ; j < events.length ; j++) {
if(events[j].id == event.id) {
ev = events[j];
break;
}
}
}
if(ev) {
var links = [];
(ev.details||'').replace(/(?:^|[^0-9a-zA-Z_])(https?:\/\/[^\s\x22'<>(){}\[\]]+)/mg,
function(m0, m1) {
links.push(m1);
return m0;
});
var html = ['<ul>']
for(var i = 0 ; i < links.length ; i++) {
var l = gadgets.util.escapeString(links[i]);
var m = /([^\/\?]+)(?:\?|$)/.exec(links[i]), t = l;
if(m) {
t = gadgets.util.escapeString(m[1]);
}
html.push('<li><a href="', l, '">', t, '</a></li>');
}
html.push('</ul>');
if(html.length > 2) {
document.getElementById('content').innerHTML = html.join('');
gadgets.window.adjustHeight();
} else {
document.getElementById('content').innerHTML = '';
gadgets.window.adjustHeight(1);
}
}
},
'selected',
addTimeDelta(event.startTime, -60),
addTimeDelta(event.startTime, +60),
{ requestedFields: ['details'] });
}
// CANVASビューを開く
function onClickContent(event) {
var el = event.target;
if(el.tagName.toLowerCase() == 'a' && el.href) {
// CANVASビューに対応するビューを検索
var views = gadgets.views.getSupportedViews();
var canvas = (views[gadgets.views.ViewType.CANVAS] ||
views[gadgets.views.ViewType.CANVAS.toLowerCase()] ||
views[gadgets.views.ViewType.CANVAS.toUpperCase()]);
// ビューを切り替える
gadgets.views.requestNavigateTo(canvas, { url:el.href });
}
}
</script>
]]></Content>
<Content type="html" view="default,canvas"><![CDATA[
<!DOCTYPE html>
<style type="text/css">
#viewer {
display:block; width:100%; height:500px;
border:none; margin:0; padding:0
}
</style>
<iframe id="viewer" src="about:blank" frameborder="0"></iframe>
<script type="text/javascript">
gadgets.util.registerOnLoadHandler(function() {
// パラメータを取得
var viewParams = gadgets.views.getParams() || {};
var url = viewParams.url;
// iframeに表示するURLを指定
if(/\.(pdf|doc|xls|ppt|svg)$/.test(url)) {
document.getElementById('viewer').src =
'https://docs.google.com/viewer?embedded=true&url=' +
encodeURIComponent(url);
} else {
document.getElementById('viewer').src = url;
}
// ガジェットの高さを調整
gadgets.window.adjustHeight();
});
</script>
]]></Content>
</Module>
Google カレンダー サイドバーガジェットについては、こちらの記事を参照してください。
ビジュアライゼーションガジェット
各県の人口を日本地図で可視化するデモを行いました。
単に Geochart を使っているだけですが、ガジェット自体は特別に作っています。県名、平成 12 年人口、平成 17 年人口が並んでいるだけのシートを、ガジェット内で Geochart に適したカラム構成に変換して表示しています。本当は DataView を使ったほうが効率がいいんですが、諸般の都合で DataTable だけで処理しています (^^;
ソースはこちら。
http://webos-goodies.jp/attachments/apps_api_japan...
<?xml version="1.0" encoding="UTF-8" ?>
<Module>
<ModulePrefs title="都道府県別の人口" />
<UserPref name="_table_query_url" display_name="データソース URL" required="true" />
<UserPref name="_table_query_refresh_interval" display_name="更新頻度 (分)"
default_value="0" datatype="enum" required="false">
<EnumValue value="0" display_value="Do not refresh"/>
<EnumValue value="60" display_value="1"/>
<EnumValue value="300" display_value="5"/>
<EnumValue value="1800" display_value="30"/>
</UserPref>
<Content type="html"><![CDATA[
<!DOCTYPE html>
<div id="chart"></div>
<script src="https://www.google.com/jsapi"></script>
<script>
var prefs = new gadgets.Prefs();
var helper = null;
var query = null;
var geomap = null;
var table = null;
// Visualization APIを読み込む
gadgets.util.registerOnLoadHandler(function() {
google.load('visualization', '1', { 'packages':['geomap'] });
google.setOnLoadCallback(function() {
helper = new google.visualization.GadgetHelper();
query = helper.createQueryFromPrefs(prefs);
sendQuery();
});
});
// クエリーの送信
function sendQuery() {
query.setQuery("select A,B,C");
query.send(handleResponse);
}
// レスポンスの処理
function handleResponse(response) {
// エラー処理
if(!helper.validateResponse(response)) {
return;
}
// Bカラムを削除したDataTableを作成
table = response.getDataTable();
var view = table.clone();
view.removeColumn(1);
// Geomapを描画
geomap = new google.visualization.GeoMap(document.getElementById('chart'));
geomap.draw(view, { 'region': 'JP' });
google.visualization.events.addListener(geomap, 'select', selectHandler);
}
// クリックされたときの処理
function selectHandler(e) {
var selection = geomap.getSelection();
if(selection && selection[0]) {
var row = selection[0].row;
alert(
table.getFormattedValue(row, 0) + 'の平成12年人口は' +
table.getFormattedValue(row, 1) + '人です。');
}
}
</script>
]]></Content>
</Module>
ビジュアライゼーションガジェットについては、少々情報が古いですがこちらの記事をご参照ください。公式のドキュメントはこちら。
デモを行ったのは以上です。 LT はかなり駆け足だったのですが(それでも時間がなくて、プライベートガジェット以降は説明できませんでした orz)、ガジェットを使うことで Google Apps をいろいろ拡張できることがわかっていただけたのではないかな、と思っています。皆さん、ぜひ試してみてください。
詳しくはこちらの記事をどうぞ!
この記事にコメントする