GoogleAppsScript勉強会に行って来ました

GDG京都さんとKyotoGASさんが主催する勉強会に行って来ました。
正直なところ今更感、漂う感じの記事ですが気にしないでください。
実は、用事があって関西に行っていたのです。

以下にメモを記載します。。。

GASとは


大雑把に言うとMSOfficeのVBAみたいなもの

  • JS 1.8Base(既存のJS資産が使える)
  • サーバサイド実行
  • Googleのサービスと連携できるAPIがいっぱいある
  • GoogleAppsの拡張
  • Advanced Google Serviceが利用(API Keyが必要)
  • Charts(グラフ)
  • JDBCでクラウドSQL利用可
  • ウェブアプリケーションの作成が可能
  • スクリプトトリガーで、任意or一定間隔でスクリプト実行できる
制限

主にあげられる制限

  • メールの本数など(GoogleAppsのユーザーや一般ユーザーの違いなど)
その他

  • GAEよりもお手軽にできる
  • ソースの共有(ソースの共有を設定していれば)
  • GAEよりも制限がゆるい

AppsScriptとクラウドBPM


  • GASの学習コストは低い
  • GAS自身に足りないところはSpreadSheetで補う(最適な方法)
  • サーバ処理、クライアント処理の連携がよい

連携例

1.Sheetでマスタ管理

(連携例) サイト<->GAS(処理を実施)<->SpreadSheat

JSONPでデータを返してやればサイト側でJS処理をするだけでよい

問題

  • JSとGASお通信でクロスドメイン問題
  • ブラウザの設定だけでやると戻すデータがカラになってしまう
2.リアルタイム集計

(連携例) サイト<->GAS(処理を実施)<->SpreadSheat

データ送信してSheetで集計

3.帳票出力

(連携例) サイト<->GAS(処理を実施)<->SpreadSheat

SpreadSheetを利用して、帳票を出す

4.一括処理

(連携例) SpreadSheetからGASに投げ、GASからサイトのAPIを実行する

定期実行をするようにしてやる

5.Googleカレンダー連携

  • キーワードをGASで取得してやる
考慮点

  • セキュリティ(サーバからアクセスするので、GoogleApps認証ができない、Keyというパラメータをもたせる)
  • 運用監視(ログをspreadSheetへ)
  • エラーの発生を極力回避するようにする
GASを使用していて困るところ

  • ソースコードの構成管理
  • httpリクエストのデバッグ(実際に手動で実行してみてリクエストを送信するしかない)
  • IP制限がない
  • 予期せぬエラーが出た場合の対処

GoogleAppsScriptを積極活用


GAS+SpreadSheetがすごいという事例紹介 特に以下がやりやすい

  • GASで勤怠管理
  • 集客ツール
勤怠管理

  • SpreadSheetをDBのように扱う
  • SpreadSheetの変更管理が大変(ユーザーが大変)
  • 受託ではやらないほうがいいかもしれない。(予期せぬ問題が起きたときの解析などが大変)
  • プログラムが得意ではない人でもGASは使いやすい(Excelユーザ向け)
  • 各種GoogleServiceとの連携に向いている

GoogleAppsScriptの新機能


GoogleAppSAPIは以下の使用方法がある

  • DATA API
  • AppsScript

GAE vs GAS

  • 速さGAE
  • 柔軟GAE(なんでもできる)
  • お仕事GAE(GASは不安定)
  • お手軽GAS(GAEよりも圧倒的に楽にアプリが組める)

GAS

  • Forms + GAS
  • Documents + GAS
  • new UI Component(Dialog,sidebar)
  • GoogleDriveIntegration

新しくFormsにToolsというメニュー項目が追加

GASからフォーム作る

ソースから新しくFormを作成するソースコード

  • フォームの作成
  • メールの送信
  • ログ出力
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function myFunction{
    // 空のフォーム
    var form = FormApp.create("アンケートひな形").setDescription("アンケート用のフォームです");    
    //入力フォーム
    form.addtextItem().setTitle("Email")
    // 1-5までのラジオボタンを作る
    form.addScaleItem().setTitle("評価").setBound(1,5).setHelpText("1..5");
    //  自由入力欄
    form.setParagrapheTextItem.setTitle("")
    // メールの送信
    MailApps.sendEmail("宛先","本文")
    // 公開用のアドレス
    Loger.log(form.getPublishedUrl())
    // 編集用のアドレス
    Loger.log(form.getEditUrl())
}
Document + GAS

  • 文章の構造化(DOM構造みたいにItemとか)を制御できるようになった
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function myFunction{
    //ドキュメント本体
    var body = DocumentApps.getActiveDocument().getBody();
    // インデックス
    body numChild = body.getNumChild();

    var i = 0,chld,type,hending,html="<div>";
    for(;i<numChild;i++){
        //  子要素
        child = body.getChild(i)
        type = child.getType()

        if(type == DocumentApps.ElementType.PARAGRAPH){
            heading = child.getHeading()
            // 不要なHeadingが付いている。これは、文章自身もパラグラフと認識されてるためだったっけ(?)
            if(heading != DocumentApps.ParagraphHeding.Normal && child.getNumChild() > 0){
                Logger.log(heading +" "+child.getChild(0).getText() )
                html + ="<p>" +heading +" "+child.getChild(0).getText()+"</p>" 
            }
        }
    html +="</div>"
}

ダイアログ表示

1
2
3
4
function showDialog(){
    var ui = HtmlService.createHtmlOutput(myFunction()).setWidth(400).setHeight(300)
    DocumnetApps.getUi().showoDialog(ui)
}

サイドバー表示

1
2
3
4
function showSideBar(){
    var ui = HtmlService.createHtmlOutput(myFunction()).setWidth(300)
    DocumnetApps.getUi().showSideBar(ui)
}
DriveSDKを使う

以下のようなコードでGoogleDriveを操作できる

  • ファイル名取得
  • ファイルをゴミ箱へ送る
  • ファイルへアクセス権を追加
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function drive(){
    // ファイル検索
    // 結果はイテレータで帰ってくる
    var fails = DriveApp.searchFiles("title contains","検索ファイル")
    var file
    while(fails.hasNext()){
        file  = fails.next();
        // ファイル名を取得する
        file.getName()
        try{
            // ファイルをゴミ箱へおくる
            // 権限がないとエラーが出るかも
            file.setTrash(true)
            // 権限を追加(Owner権を追加)
            file.setOwner("追加するユーザー")
        }catch(e){
        }
    }
}
質問

  • 補完は出ないときは、一回保存して開き直すとかで対処(リファレンス読み直せばいい)
  • GASでプレゼンテーションは操作できない(予定もない)
  • GASで作ったファイルはドライブに保存される
  • FormはSpreadSheetにプログラムでひもづけることもできる