WeWorkへの来客時に電話で呼び出す

[WeWork](https://www.wework.com/)のコミュニティ・バー（受付）に来客があると、登録してあるメールアドレス宛にメールで通知があります。
すぐにメールに気づかないことも多く、大事なお客様をボーっとお待たせすることになりかねないので、Twilioを使って電話をかけるようにしてみました。

# 概要
WeWorkから届いたメールに対してGmailのフィルターで特定のラベル（例えば`wework`）を付け、Google Aps Scriptでそのメールに反応して、Twilioを呼び出して特定の番号に電話をかけます。

# 前提
* メールはGmailを使ってる
* Twilioは有料版にアップグレードしないと余計なアナウンスが入ります

# 参考
Gmailに反応してTwilioに電話をかけるコードは、[Google Apps ScriptとTwilioで、システムアラートを100%気付ける環境作り](http://blog.katty.in/7539)をほぼそのまま利用させていただいています。ありがとうございます。

# WeWorkから届いたメールにラベルをつける
WeWorkのコミュニティ・バーに来客があると、メンバーとして登録してあるメールアドレス宛にWeWorkからメールが届きます。
なお、メールの差出人（From）はWeWorkのロケーションごとに違っていて、`WE-JP-XXXX@wework.com`のような感じです（請求のメールなども`@wework.com`から送られてきますが、`WE-JP-XXXX`ではありません）。
Gmailのフィルターで差出人などを条件に特定のラベルを付けます。フィルターの使い方は[Gmailヘルプ](https://support.google.com/mail/answer/6579?hl=ja)などを参考にしてください。
ラベルを付けなくてもできますが、実装が楽なのと後から来客を一覧で見れたりするので私はラベルを付けることにしました。

# Twilioに登録する
Twilioのアカウン／電話番号を持っていなければ[サインアップ](https://twilio.kddi-web.com/signup/)してください。サインアップすると`050`の電話番号とアカウントSID、AUTHTOKENが発行されます。
前提にも書きましたが、無料のトライアルアカウントのままでも使えますが、電話をかけた時にアップグレードしてねってアナウンスが入ります。

# Gmailに反応してTwilioを呼び出すGoogle Apps Script
Google Driveから新規に`Google Apps Script`を作って、以下のコードをコピーし、TwilioのアカウントSID、AUTHTOKEN、および発行された電話番号とかけたい先の電話番号を反映してください。

`wework`ラベルの付いた未読のメールが`Inbox`にあると30秒間電話を鳴らします。既読になっていると何もしません。
なお、このコードではSubjectを一回だけそのまま読み上げています（44行目あたり）。お好みに合わせて変更してください（日本語も使えます）。

保存したら、メニュー`Run`から`checkMailAndMakePhoneCall`を選択して実行してみましょう。Googleアカウントの選択とGmailにアクセスすることの確認があります。承認すると電話がかかってきます（未読のメールがある場合）。

```
ACCOUNT_SID = "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
AUTHTOKEN = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
FROM = "+8150xxxxxxxx";
TO = "+81xxxxxxxxxx";
LABEL = "wework";


function checkMailAndMakePhoneCall() {
  var weworkCallThreads = getLabeledUnreadThreads(LABEL);

  if (weworkCallThreads.length > 0) {
    var subject = weworkCallThreads[0].getMessages()[0].getSubject();
    Logger.log('Make a 30-second phone call: ' + subject);
    makePhoneCall(30, subject);
    return;
  }

}


function getLabeledUnreadThreads(labelName) {
  var labeledUnreadThreads = [];
  var threads = GmailApp.getInboxThreads();
  for (var i in threads) {
    var thread = threads[i];
    if (!thread.isUnread()) {
      continue;
    }
    var labels = thread.getLabels();
    for (var j in labels) {
      var label = labels[j];
      if (label.getName() == labelName) {
        labeledUnreadThreads.push(thread);
      }
    }
  }
  return labeledUnreadThreads;
}


function makePhoneCall(timeout, subject) {
  var message = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
      "<Response><Say language=\"ja-jp\">" +
      subject +"</Say></Response>";
    
  var options = {
    'method': 'post',
    'headers': {
      'Authorization': 'Basic ' + Utilities.base64Encode(ACCOUNT_SID + ':' + AUTHTOKEN)
    },
    'payload' : {
      'Url': 'http://twimlets.com/echo?Twiml=' + encodeURI(message),
      'From': FROM,
      'To': TO,
      'Timeout': timeout.toString()
    }
  };
  UrlFetchApp.fetch('https://api.twilio.com/2010-04-01/Accounts/' + ACCOUNT_SID + '/Calls', options);
}
```

# 1分毎にチェックする
Google Apps Scriptは定期的にコードを実行することができるので、例えば1分毎に実行させて電話に気づかなくてもしつこくかけ直すようにしておきましょう。
Google Apps Scriptのメニュー`Edit`から`Current project's triggers`を選択、`Developer Hub`の右下にある`Add Trigger`でトリガーを作成します。
<img width="901" alt="GAS_triiger.png" src="https://qiita-image-store.s3.amazonaws.com/0/53141/be214502-b1c6-7ed7-3306-6130f6f9db91.png">

これで大事な来客をお待たせすることがなくなるハズ。