Google Apps Scriptで、Googleカレンダーを調べる

最近個人的にアツいのが、Google Apps Scriptです。

Google Docsでオンラインでスクリプトを記述でき、そこで実行してGoogleの様々なサービスにアクセスできたりします。かなり夢が広がります。今後何回か扱っていきたいと思っていますが、まずは簡単な導入の話です。

Google Docsスプレッドシートにもスクリプトを書けますが、今回はちゃんとした開発画面をDocsに導入し、そこで開発してみます。

導入

Google Docsの左の「作成」ボタンを押し、「アプリを追加」を押して、「Google Apps Script」を選びます。
f:id:Schima:20131024000251p:plain

これで作成できるドキュメントの種類に「スクリプト」が追加されますので、それを押して新規作成します。

メールを送ってみる

以下のようなコードを書きます。簡単ですね。

function sampleSendEmail()
{
  var email = "自分のアドレス@hogehoge.com"
  GmailApp.sendEmail(email, "無題", "こんにちは世界");
}

実行するfunction名を、今書いたコードに合わせて(ここではsampleSendEmail)、実行すると、指定したEmailアドレスにメールが届きます。
f:id:Schima:20131024000608p:plain

実行は上の三角ボタンです。隣の虫マークはデバッグ実行です。コードの行番号付近に赤丸のブレークポイントを設定しておくと、そこで実行を一時停止できたりします。ブラウザでここまでやるとは、恐ろしい。

ドキュメントを作ってみる

function sampleCreateDoc()
{
  var doc = DocumentApp.create("Hello world!");
  doc.getBody().appendParagraph('Hogehogeeeee');
}

Google Docsのホームディレクトリを見ると、「Hello world!」というタイトルのドキュメントができているはずです。中には「Hogehogeeeee」と書かれています。

ここまで2つは、公式のQuick Startのサンプルからでした。こんな感じで、次はカレンダーに触ってみます。

カレンダーから検索

「ある指定したカレンダーの、指定した時間帯に予定が無いかどうか」を調べるコードを書いてみます。

一応背景を言いますと、私の会社では全社員がGoogle Calendarで予定管理をしています。ほかの社員のスケジュールは全部見える状態です。で、特に上役の人は予定がびっちりで、そこに自分のための会議等を入れ込むのは簡単ではありません。それを探せると便利です。
(目で見たほうが早いとかいう無粋な話は禁止です。)
今回の例では、対象の人のカレンダーをフォローしている前提で、その人のランチの都合が取れそうか(12:00~13:00がの予定が空いているか)、を調べるコードになっています。

コード

mainから実行します。

function main()
{
  startTime = new Date();
  endTime = new Date();
  startTime.setHours(12, 0, 0);
  endTime.setHours(13, 0, 0);
  
  meetable("Hoge", startTime, endTime);
}

function meetable(name, startTime, endTime) {
  // nameの人のカレンダーを取得 (フォローしてる前提)
  var cals = CalendarApp.getAllCalendars();
  var cal = getCalendarByName(cals, name);
  if(cal == null) {
    Logger.log(name + "という名前のカレンダーは見つかりません");
    return;
  }
  
  // この先一週間で空いてるかどうか
  for(var i=0; i<7; i++){  
    var events = cal.getEvents(startTime, endTime);
    var dateStr = (startTime.getMonth()+1) + "月" + startTime.getDate() + "日";
    if(events.length > 0){
     Logger.log(dateStr +"は、"+name+"さんの予定は埋まってそう");      
    }else{
      Logger.log(dateStr +"は、"+name+"さんの予定は空いてます");
    }
    
    startTime.setDate(startTime.getDate()+1); 
    endTime.setDate(endTime.getDate()+1); 
  }
}

function getCalendarByName(calendars, name){
  for(var i=0; i<calendars.length; i++){
    if(calendars[i].getName() == name)
      return calendars[i];
  }
  return null;
}

実行結果例

Logger.log による出力内容は、上のメニューの「表示」→「ログ」で表示できます。
f:id:Schima:20131024001541p:plain

こんな感じで、直近一週間でランチに行けそうな日がわかります。土日が入ってしまっていますが。

これが5人の会議で全員が空いている日を調べる、ですとか、この先1か月で調べる、となれば、コードで調べる意義も出てくる・・・はずです。