Google Spreadsheetに新しい行が追加されたらChatworkに通知する

# 概要
サイトのお問い合わせ情報をGoogle Spreadsheetで管理してます。(お問い合わせが来たら一番下の行にお問い合わせ内容が追加されるようになってる)
しかし人間は人間なので見逃したり忘れたりします。見逃したり忘れたりしないように、Chatworkと連携して通知してくれるようにしました。

# 使うもの
* Chatwork API(bot用のアカウント作って[API認証](http://developer.chatwork.com/ja/authenticate.html)しておく)
* Google Apps Script 

# やりかた
## Chatworkの連携
![スクリーンショット 2016-07-26 8.00.28.png](https://qiita-image-store.s3.amazonaws.com/0/27258/2a28fa24-5a19-ca37-c4b0-2aa304c2ffc5.png)

連携させたいスプレッドシートのツール→スクリプトエディタで、いろいろやっていくことになります。

この[大変ありがたい記事](http://qiita.com/y_minowa/items/39db8ca5bffc9c440caf)を参考にChatwork連携のライブラリを入れて喋らせましょう。

![スクリーンショット 2016-07-26 8.03.12.png](https://qiita-image-store.s3.amazonaws.com/0/27258/8e365db9-0690-e1db-c801-3a089094345a.png)

エディタ内のリソース→ライブラリで、Chatworkのライブラリを読み込ませてあげます。

あとはこんな感じにしたら喋るんじゃないでしょうか。

```js:code.gs
/*
チャットワークテスト用
*/
var sendChatworkTest = function(message) {
  Browser.msgBox("call chatwork");  // ←デバッグ用にこういうの入れておくといいです
  var client = this.ChatWorkClient.factory({token: '【APIトークン】'});
  // テスト部屋へ送る
  client.sendMessage({room_id: 【グループチャットURL末尾の数字】), body: message});
}
```

これで、`sendChatworkTest("テスト");`などとすれば喋りますね。
本番用は本番用で別のグループチャット宛ての同じような関数作るといいでしょう。

Google Apps Script、基本的に重いので辛抱が必要です。結果が出るまで数時間かかった昔のコンピュータに思いを馳せるなどして各自耐えしのぎましょう。

## 通知済かどうかの列を作る
Google Apps Scriptにはトリガーというのがあって、スプレッドシートが開かれたときとか更新されたときに指定した関数を実行できる。
しかし残念ながら「新しい行が追加されたとき」というトリガーはないので、一番下の行が新しい行かどうかは自分で識別させる必要がある。
ので、それ用の列を端っこの方に作ります。
![列の様子です](https://qiita-image-store.s3.amazonaws.com/0/27258/68c7589e-70e7-cd3d-4e97-f8260129df26.png)

一行目は後で使うラベル行として、noticedかなんかにしておきます。人間の役には立たないので非表示にしておきましょう。
やりたいこととしては、更新がある度に最下行のここの列をチェックして、trueになってなかったら新しい行なので、通知してtrueにする、って感じですね。

![名前とか](https://qiita-image-store.s3.amazonaws.com/0/27258/726bbaa8-13cf-ccfd-ae4a-0ceaa4ae5c25.png)

あとは名前とか、通知内容に必要なやつも適当にこんな感じで1行目にラベルつけておきます。

では、やっていきましょう。


## コードを書く

```js:code.gs
/*
新規問い合わせ通知
*/
function newInquireNotice() {
  // シート情報を取得
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = SpreadsheetApp.getActiveSheet();
  
  // 複数シートがある場合、お目当てのシートの話じゃないならやめる 
  var sheetName = sheet.getSheetName();
  if (sheetheetName !== "inquireList") { // ←ここは使ってるシート名を入れてあげてください
    return;
  }
  
  // ラベル列を検索して返す関数
  function colSearch(label) {
    for (i = 1; i <= sheet.getLastColumn(); i++) {
      if (sheet.getRange(1, i).getValue() == label) {
        return i;
      }
    }
  }
  
  // company, name, noticedの列数
  var companyCol = colSearch("company");
  var nameCol = colSearch("name");
  var noticedCol = colSearch("noticed");

  // 最新行のnoticedがtrue入ってなければ通知出してtrueにする関数
  function newNotice() {
    lastRow = sheet.getLastRow();
    var thisNoticed = sheet.getRange(lastRow, noticedCol);
    
    if (thisNoticed.getValue() !== true) {
      var newName = sheet.getRange(lastRow, nameCol).getValue();
      var newCompany = sheet.getRange(lastRow, companyCol).getValue();
      // 会社名は無いこともあるので、適当にうまいことやる
      if (newCompany) { 
        newCompany = "(" + newCompany + ")";
      }
      
      var message =
          "[info][title]新規お問い合わせ[/title]"
          + newName + "さま"+ newCompany +"からお問い合わせがありましたよ！\n\n"
          + "対応よろしくお願いします！\n\n"
          + spreadsheet.getUrl() + "#gid=" + sheet.getSheetId() + "[/info]";
      
      // 通知済のところをtrueにする
      sheet.getRange(lastRow, noticedCol).setValue(true);

      // テスト用
      sendChatworkTest(message);
    }
  }
  newNotice();
}
```
こんな感じでしょうか。
基本は`sheet.getRange(行, 列).getValue();`でセルを取得したり、
`sheet.getRange(row, col).setValue(内容);`で中身を入れるやり方がわかれば、あとは応用でうまいことやっていけると思います。
ポイントはGoogle Apps Scriptは列を文字で検索する関数すらないので、作らなければならないことです。つらいですね。

## トリガーを仕掛ける
あとはこの関数を、スプレッドシートの更新があるたびに発動するだけです。
トリガーを仕掛けるのは何種類か違ったやり方があるようですが、一番手っ取り早いGUIで設定するやつを使います。
(コードで設定するやつもやってみましたが、そっちから呼ぶとなぜかChatworkの通知が発動してくれなくて最悪でした)

![スクリーンショット 2016-07-26 8.38.37.png](https://qiita-image-store.s3.amazonaws.com/0/27258/6a2575e6-0d3d-d3f5-2159-537cc2d72fd0.png)

リソース→現在のプロジェクトのトリガー で、

![スクリーンショット 2016-07-26 8.39.33.png](https://qiita-image-store.s3.amazonaws.com/0/27258/310d4ecd-6315-9fd1-4bba-160823dfa929.png)
こうですね。

## 結果
![スクリーンショット 2016-07-26 8.46.41.png](https://qiita-image-store.s3.amazonaws.com/0/27258/60c48425-0b55-9658-7688-02d6826eb88f.png)

やった〜！

以上です。

## 応用

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">お問い合わせ対応が遅れてると通知原さとみが罵倒してくれる機能が付きました。罵倒は現在「やる気あるんですか？」「しっかりしてくださいよ。」「何のために生きてるの？」の3種類。メンバーの要望に応じて増えていくぞ！ <a href="https://t.co/Zecqxz78Wo">pic.twitter.com/Zecqxz78Wo</a></p>&mdash; あずま (@sngazm) <a href="https://twitter.com/sngazm/status/757535194085601280">2016年7月25日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

これを応用するとこのように、通知原さとみに罵倒してもらうことも可能になります。
需要があればやり方も書きます。

# まとめ
こんな感じです。簡単でしょ？（僕は一日かかりました）
属人的な内容の多いお問い合わせ対応だからこそ、通知や自動化で人為的なミスや負担を減らしてくことでメンバーの能力を最大化できるんじゃないかなと思います。

間違ってるところとか、もっと良い書き方があるとかあれば、こっそりやさしく教えてください（こっそりじゃなくてもいいです）