2011/09/16

Google Apps Script ってすごいね

先日まで、Google Developer Day 2011 の DevQuiz がありました。

その中で Apps Script に関する問題が出題されていました。

個人的に気になっていたもので、ちょっとやってみることにしたのですが、ユーザガイドをみて驚きました。機能がすごく充実しています。

「オラ、わくわくすっぞ!」って感じです。


Google Apps Script ってなに?


Google Apps Script は、JavaScript を使用して Docs, Spreadsheets, Sites などから各種 Google サービスを制御することできます。
Microsoft Office における VBA のようなものです。

Apps Script では、作成した JavaScript のプログラムがサーバ上で実行される、という点が特徴ですね。


まだまだ日本語の情報が少ない Google Apps Script ですが、 Googleを追いかけろ! が参考になります。


Google Apps Script って何が出来るの?


何が出来るのかは、これから見ていきましょうw。

Excel を Apps Spreadsheets に移行する際の障壁は、VBA マクロだと思っていましたが、それが取り除かれた。と思ってもいいくらいなことができそうな予感です。


Google Apps Script を使ってみる


何はともあれ、どんなものかやってみましょう。


お題


よくある Excel マクロのように、CSV ファイルを読み込んで、Spreadsheets に出力してみます。


  1. スクリプトエディタ

    新規に作成した Spreadsheet から、ツールメニューの「スクリプトエディタ」でスクリプトエディタを起動します。

  2. コードを記述

    コード欄に下記を打ち込みます。

    function onOpen() {
      var app = UiApp.createApplication().setTitle("Upload CSV to Sheet");
      var form = app.createFormPanel().setId('frm').setEncoding('multipart/form-data');
      var formContent = app.createVerticalPanel();
      form.add(formContent);
      var file = app.createFileUpload().setName('thefile');
      var button = app.createSubmitButton('Submit');
    
      formContent.add(file);
      formContent.add(button);
    
      app.add(form);
    
      var doc = SpreadsheetApp.getActive();
      doc.show(app);
    }
    
    function doPost(e) {
      var app = UiApp.getActiveApplication();
      var fileBlob = e.parameter.thefile;
    
      var data = fileBlob.getDataAsString();
      if (!data) {
    	return app.close();
      }
      var csvData = data.split('\n');
    
      var sheet = SpreadsheetApp.getActiveSheet();
      sheet.getRange(sheet.getLastRow()+1, 1).setValue(fileBlob.getName());
    
      var startRow = sheet.getLastRow()+1;
      var startColumn = 1;
      for (var i=0,l=csvData.length;i<l;i++) {
    	var csvRow = csvData[i].split(',');
    	for (var j=0,l2=csvRow.length;j<l2;j++) {
    	  sheet.getRange(startRow+i, startColumn+j).setValue(csvRow[j]);
    	}
      }
    
      return app.close();
    }
    		
  3. Script の実行

    フロッピーアイコンでスクリプトを保存し、「関数を選択」より「onOpen」を選択します。

    再生ボタンでスクリプトを実行します。

  4. CSV をアップロード

    表示されたフォームより、適当な CSV ファイルを選択して、Submit です。

  5. CSV がシートに出力される

    CSV の内容がシートに書きだされました!


プログラムの説明を少しすると、[onOpen]という関数が、シートを開いたときに自動実行される関数です。VBA にもありますね。

ここで、アップロードフォームを作成し、表示させています。

もう一つの[doPost]という関数。これはフォームポスト時に呼び出されるもので、データの取得とシートへの書き出しを行っています。

doPost がポスト時に呼ばれるということに気付くまで結構はまりました…。


参考までに、アップロード時に使用した CSV と、Spreadsheet は下記から。参考にしてください。
*スクリプトの実行はできません


Google Apps Script をやってみて


リファレンスとにらめっこが必要ですが、汎用的な JavaScript で記述できるので非常にわかりやすいですね。

これから少しずつ、どんなことができるのか確認しながら、紹介してきたいと思います。

2011/09/12

Google AppEngine の新料金体系

とっても久しぶりのブログ更新です。皆さんお元気ですか?僕は元気です。


最近、AppEngine の料金体系変更によって、大幅に料金が増えるという話題をよく目にします。

気になって自分も確認してみました。
そして、多分にもれず驚いたのでメモしておきます。


AppEngine 新料金体系


AppEngine の新料金体系は、従来(現行)の CPU Time での課金から、Instance Hours での課金に変更されます。


料金の詳細は、 Google cloud services – App Engine に記載されています。


また、気になる、新料金体系ではどのように見積もられるのか?は、Admin Console の Billing History から確認することができます。



via Managing Your App's Resource Usage - Google App Engine - Google Code

今なら半額キャンペーン中!


上記のレポートの一例では、 Frontend Instance Housrs は、 $12.41 となっています。

為替レートが 1米ドル /円 = 77.089115 (ほんと円高ですね)ということなので、約956円/日。一ヶ月で 28,700円です。


でもよくみると、「Frontend Instance Hour costs reflect a 50% price reduction active until November 20th, 2011.」となっています。

11月20日までは半額キャンペーン中みたいです。

確かに Frontend Instance Hours: $0.04/Hour となっています。正規の料金は $0.08/Hour ですよね!


キャンペーンが終了したらどうなるのでしょうか?

単純に倍なので、約1,912円/日。一ヶ月で 57,400円です。


これ、みんな気づいているんでしょうか?僕は最初気がつかなかったです。

ダブルでビックリしますね。


新料金体系対策


今まで無料枠で気軽にアップしていたアプリが、突然金食い虫になったらたまりません。


App Engine アプリケーションのリソースを管理する方法 - Kay's daddy のリソースの管理方法が参考になります。


要は、ちゃんとリソース意識してアプリ作ってね、ということですが、

一番手軽な方法は、Admin Settings にある、 Max Idle Instances を 1 にする ということでしょうか。


近頃は、フリーミアムモデルからフリーの部分がなくなる、もしくは縮小される傾向が強いように思います。

手軽な環境がなくなっていくのは残念ですね。