2013年10月13日日曜日

認証なしでPOSTされたデータをGoogleAppsScriptでスプレッドシートに追記する

便利そうでギリギリしんどいGoogleSpreadSheetとGoogleAppsScript。
アンケートフォームとかでも使いたいけどギリギリ使えない。

なんとか、「素のPOSTを受け取ったらそれを限られた人しか見れないドキュメントに保存」という動きが作れたのでここで説明。POSTを送る側は、PHPとかで適当に作るイメージ。だからGoogleAppsScriptをAPI的に動かそうってわけ。



ウェブアプリケーションとして導入のくせ者


スクリプトエディタから、「ウェブアプリケーションとして導入」を選ぶと、単独のURLを持つことができる。さぁこのURLがくせ者。このURLはいくつかモードがある。

  • 開発中モード
    • 最後にDEVがつく。どうもこいつは今編集しているブラウザからのセッションを見て、ログイン中のユーザかどうかを見てるっぽい
    • だから外部からのアクセスするテストにはこのURL使えない
  • 版という概念
    • 何度編集してもかわんねーなーという時がある。そういうときには、
      ファイル→版を管理
      を選らんで、版を変える。
      版を変えたら、もう一回「ウェブアプリケーションとして導入」を選らんで、最新版の番号を選ぶ

サンプルスクリプトはこれ


// Script-as-app template.
function doPost(e) {
  insertData(e.parameter);
  var output = ContentService.createTextOutput();
  output.setMimeType(ContentService.MimeType.JSON);
  output.setContent(Utilities.jsonStringify(e)); //送られてきたパラメータを全部返す(デバッグ用)
  return output;
}

function insertData(param){
  //urlは適当に変えて
  var sheet = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheet/ccc?key=xxxxxc#gid=0");
  //postパラメータは適当に変えて
  sheet.appendRow([param.name,param.company,param.mail,param.tel,param.division,param.position]); 
}

セキュリティモデル

どういうセキュリティで動かすかっていうとね。

一般ユーザがアクセスするPHP(これは認証なし)
GASの「アプリケーションにアクセスできるユーザー:」を「全員(匿名ユーザ含む)」
GASの「次のユーザーとしてアプリケーションを実行:」を「自分」
に設定する
自分に編集権限のあるスプレッドシートにアクセス

こんな感じ。こうやって中と外を明確に分けることができる。


これ何がいいの?

Googleのセキュリティモデルがちょっと変わって、PHPからのアクセスがくっそ面倒になったのね。トークンがどうたらこうたらで。PHPだとZendGDataとか使わなくちゃいけなくて、そいつがまたやったらファイルが多い。クライアントログインしか方法がないAPIもまだあるのに「クライアントログインは非推奨です」とかいいよる。ペラ1のPHPでやりたかったので、認証はGoogleAppsScript側で境界を作ろうと。そしたらほうら便利。

今後の展開

postからのinsartができたんだから、今度はキーダイレクトで行を呼び出して編集ができるんじゃないのとかって発想になりがちだけどそれはやらない。データの追加は認証なしでもいいけど、再編集は超セキュアにしないといけない。さらに、GoogleSpreadSheetは遅いので検索とか向かない。気軽にアンケートフォームを作るってのがちょうどいい。



0 件のコメント:

コメントを投稿