加賀一稿一記

心は戦国

自分用メモ・webを介してスプレッドシート操作

スプレッドシートに限らずGoogleのサービスなら大体操作できる.
メールとか翻訳とかファイル操作とか.

googleドライブを含めたGoogleのサービスのいくつかは,Google Apps Scriptで操作できる.
Google Apps Scriptはwebアプリケーションとして公開できるので,webを介して操作できることになる.


今回は,アクセスが来たらクエリ文字列をスプレッドシートに書き込むというプログラムをGAS側に用意しておき,wgetコマンドでURLにアクセスしてみる.

適当なスプレッドシートを作ってスクリプトエディタで

//main.gs
function doGet(e) {
  if(e.parameter.val!=undefined){
    logwrite(e.parameter.val);
    return HtmlService.createTemplate(html("成功")).evaluate().setSandboxMode(HtmlService.SandboxMode.IFRAME);
  }
  else{
    return HtmlService.createTemplate(html("失敗")).evaluate().setSandboxMode(HtmlService.SandboxMode.IFRAME);
  }
}

function logwrite(s){
  var form = SpreadsheetApp.openById("ここにスプレッドシートのid").getSheetByName("ここにシートの名前");
  var LastRow = form.getLastRow();
  var today = new Date();
  form.getRange(LastRow+1,1).setValue(""+today);
  form.getRange(LastRow+1,2).setValue(s);
  return "success";
}

function html(s){
  var bef = "<!-- index.html --><!DOCTYPE html><html><head><meta charset=\"utf-8\"></head><body>";
  var aft = "</body></html>";
  return bef+s+aft;
}

を書く.(必要に応じて適当に直す)

webアプリケーションとして公開したら終わり.
アプリケーション実行は自分,
アプリケーションにアクセスできるユーザーを匿名全員にする必要がありそう.
セキュリティ的なアレがソレになってしまう気がするので,そこらへんは頑張る.

wget https://script.google.com/macros/s/***秘密***/exec?val=364364

こんな感じでURLを叩くことで,
f:id:kgsn:20170526140033p:plain
スプレッドシート操作できました.
ブラウザのURL欄で叩いた場合はHTMLに"成功"もしくは"失敗"と書かれて帰ってくる.
HTMLに限らず,xmlなりtxtなりを返せばいいんじゃないですかね.


余談
ネットに繋がる端末であれば情報を簡単にスプレッドシートに保存できるわけなので,
IoT的な使い方が考えられます.(GASでメール送信とかもできるし便利だね)
が,IoTのリアルタイム性ってどんなもんなんでしょ.
例えば1日の気温をセンシングしたいとかなら5分や10分の間隔で送信してクラウドで確認すりゃいいと思うけれど,
ミリ秒くらい細かく刻んだデータが欲しい場合だとリアルタイムにクラウドで確認するのは厳しそう.
(少なくともGASでは通信とデータベース処理が間に合わないと思うし,API使用回数も気になる)
リアルタイムに値を確認することはあきらめて,定期的に溜まったデータを送信するにしても通信量は押さえたいトコロ...,
とか考えていたが,そもそも手元にIoTデバイスがあるわけでもないので悩む必要はなかった.