社内運用ChatbotへのフィードバックをGoogle Spreadsheetで受け取る

# 結論
Chatworkへの通知にフィードバック用のリンクを追加し

<img width="522" alt="スクリーンショット 2018-03-12 9.15.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/15964/33fe06dc-fae2-82a9-19ea-ba53648cafc2.png">

Google Spreadsheetで見られるようにしました。

<img width="860" alt="スクリーンショット 2018-03-12 9.15.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/15964/cfc85e0e-4801-7782-fa71-8159b8056806.png">


# 背景

クローズドな環境(社内向けChatwork)でChatbotを運用しています。例えば、

- 定時通知
- 1日のスケジュールの通知
- gitの更新通知

Chatbotは運用すると、役に立っているかどうかフィードバックが欲しいです。
例えばgoogleのコードレビュー用のbotには、「使えないボタン」が存在しているそうです。

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">レビューについて自動化している部分はあるか？<br>Tricorderというコードレビューの自動化はある。<br>静的解析のベンダーはレポーティングをしがち<br>botから来たレポートに対して「使えないボタン」が存在している<br>変更していないコードにはFBが来ないようにしている<a href="https://twitter.com/hashtag/JaSST?src=hash&amp;ref_src=twsrc%5Etfw">#JaSST</a></p>&mdash; ブロッコリー (@nihonbuson) <a href="https://twitter.com/nihonbuson/status/971214382666465280?ref_src=twsrc%5Etfw">March 7, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 目的

なるべく簡単な手段で、ボットにフィードバック用のボタンを追加したいです。

そこで、[Google Spreadsheet を簡易 Webサーバーとして動かして、手軽にWebHookを受け取る方法 - Qiita](https://qiita.com/kunichiko/items/7f64c7c80b44b15371a3) を使います。

単純にプラスとマイナスの評価を受け取るためのリンクを作成します。
URLのイメージは

```
https://script.google.com/feedback?vote=good
```

です。クエリパラメータでフィードバックの種類を受け取り、スプレッドシートに追記します。
実際のURLは、Google docsが生成するもっと長いURLです。

# 手段
Web APIとして公開する方法は前述の記事を参考にしてください。
公開するスクリプトは、次の処理を行うGoogle Apps Scriptです。

1. GETリクエストに対応
2. クエリパラメータの値を取得
3. スプレッドシートに追記


## 実装

```js
// GETリクエストに対する処理
function doGet(request) {
  // クエリパラメータを取得
  var vote = String(request.parameter.vote)

  // スプレッドシートに追記
  var ss = SpreadsheetApp.getActive()
  var sheet = ss.getActiveSheet();
  sheet.appendRow([new Date(), vote]);
  
  // メッセージ表示
  var output = ContentService.createTextOutput("フィードバックの送信感謝いたします。");
  output.setMimeType(ContentService.MimeType.TEXT);
  return output;
}
```

### GETリクエストに対応

前述の記事通りです。

### クエリパラメータの取得

ここは前述の記事に記載されていません。
[Web Apps  |  Apps Script  |  Google Developers](https://developers.google.com/apps-script/guides/web#url_parameters) を見ると、引数オブジェクトの`parameter`プロパティに、クエリパラメーターをパースしたオブジェクトが入っています。これを使います。

```js
String(request.parameter.vote)
```

### スプレッドシートに追記

前述の記事通りです。

### メッセージを表示
returnした戻り値が、レスポンスBodyになります。
つまり、ブラウザでリンクを開いた場合、戻り値がページの内容として表示されます。
心ばかりの感謝の気持ちをメッセージとして表示します。

# 課題

## 詳細なフィードバック
本実装では

- 送信ユーザの特定
- 詳細な要望のフィードバック

は、行えません。
Googleフォームを作って、メッセージにフォームへのリンクなどを作れば実装できそうです。
忠誠度の高いユーザーが、フォームを使ってくれるかどうかは、やってみないとわかりません。


## いたずら防止

Google Spreadsheetの公開権限は、以下の３つです。

- 自分
- 全員
- 全員（匿名を含む）

Googleドキュメントへのログインを強制しない場合は、`全員（匿名を含む）`しか選択肢がありません。
またURLは固定で、定期的な変更ができません。（できても、chatbotのメッセージを更新する手間は必要です。）

「リンクのURLをスクリプトで自動的に複数回呼び出す」いたずらは簡単にできます。
不特定多数のユーザー向けに行うには、不適当に思えます。

# 参考

- [Google Spreadsheet を簡易 Webサーバーとして動かして、手軽にWebHookを受け取る方法 - Qiita](https://qiita.com/kunichiko/items/7f64c7c80b44b15371a3)
- [Google Apps Scriptを使って簡易APIをサクッと作る - Qiita](https://qiita.com/edo_m18/items/0519d241ac7683815a53)
- [Web Apps  |  Apps Script  |  Google Developers](https://developers.google.com/apps-script/guides/web#url_parameters)