GAS 入門（Spreadsheet → GoogleDrive → Slack）


## 概要

以下の各記事を参考にGASを触ってみたのでそのまとめです

- [GoogleAppsScriptで特定のDriveフォルダにあるファイル更新情報をSlackで通知する](https://qiita.com/minanami/items/9354424db32aba7e6a86)
- [SlackのWebhook URL取得手順](https://qiita.com/vmmhypervisor/items/18c99624a84df8b31008)
- [【JavaScript】日付処理](https://qiita.com/kazu56/items/cca24cfdca4553269cab)
- [Google Apps Script で Spreadsheet にアクセスする方法まとめ](https://qiita.com/negito6/items/c64a7a8589faaffcfdcf)
- [Google Apps Scriptの初回実行に必要となる承認手順](https://www.virment.com/step-allow-google-apps-script/)
- [Google Apps Script で毎日決まった時刻にスクリプトを実行するトリガー設定](https://tonari-it.com/gas-trigger-set/)
- [日付を加算または減算する](https://support.office.com/ja-jp/article/%E6%97%A5%E4%BB%98%E3%82%92%E5%8A%A0%E7%AE%97%E3%81%BE%E3%81%9F%E3%81%AF%E6%B8%9B%E7%AE%97%E3%81%99%E3%82%8B-b83768f5-f695-4311-98b1-757345f7e926)

## 作るもの

今回は、**Spreadsheetに設定情報を管理して、その情報をもとに特定のGoogleDriveのフォルダ内に入っている全ファイルの更新履歴を見て、設定情報に指定されている日付よりも古い場合は、Slackに通知する**、というものをGASでサクッと作ってみようと思います。

## 準備

GASはアプリの追加からスタート
<img width="600" alt="スクリーンショット 2019-06-21 17.21.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/849f8f40-ae0e-bde2-168e-a229ea070b5e.png">
そうすると右メニューからGASが現れるようになる
<img width="600" alt="スクリーンショット 2019-06-21 17.22.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/e896e66e-6e53-83ef-2df0-78f2d10b484c.png">
ここで試しに[公式の最初に紹介されているサンプルコード](https://developers.google.com/apps-script/reference/drive/?authuser=1)を試してみることに
<img width="600" alt="スクリーンショット 2019-06-22 13.37.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/68834422-5b3c-17f2-a973-33a28914213a.png">
<img width="580" alt="スクリーンショット 2019-06-21 17.25.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/9c392ae4-f509-cfd2-5746-e4d21508edea.png">
そうするとこんなポップアップが出てくるのでGASとアカウントを紐づけていく
<img width="580" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/265c9f75-97b6-574b-afb0-441f573aedac.png">
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/2cb1d053-9126-d6fd-be94-61fe52afd3f4.png"> <img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/843cfe31-fcf7-e392-0067-8a80b73e73d9.png">
そうすると警告が出てくるので詳細から**無題のプロジェクト（安全ではないページ）に移動**を選択
もし心配である人は今回作ったGASのプロジェクトを公開するなり正式な情報を設定するなりすると警告は無くなると思います
今回は特にちゃんとした目的はないのでこのまま進めていきます
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/54ea78aa-33e9-e09f-d1b9-bf5fc0bf159c.png">
次はGASと紐づけたアカウントで扱うGドライブとの連携
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/380aee62-2103-79be-69c7-b5f6e462e1ee.png">
そして関数を指定して実行(▶️)する
Gドライブ全件のファイル名を取得するためファイル数に応じて実行時間が変わります
`Logger.log`関数はメニューからログを指定するとその詳細が表示されます
<img width="254" alt="スクリーンショット 2019-06-22 13.50.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/727fddd4-22b6-681c-1982-0df215e9318a.png">
<img width="276" alt="スクリーンショット 2019-06-22 13.51.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/4f5b330f-b255-4470-b172-956ed1da2d63.png">

これで一通りの仕組みが分かったので早速作っていきましょー！

## Slackへ通知

まずは通知先のSlackの設定です
[Incoming Webhooks を通知先Slackで追加](https://slack.com/services/new/incoming-webhook)設定していきます
<img width="600" alt="スクリーンショット 2019-06-21 17.59.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/f073fb47-3a79-ece7-d285-bf983c02e1ce.png">
WebhookするURLが発行されてこれを使用します
<img width="600" alt="スクリーンショット 2019-06-21 17.59.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/b31d2e70-e4fb-3ab8-9080-68bf4f7f9003.png">
一番下にスクロールして**設定を保存する**をクリックして設定内容を確定させる
<img width="600" alt="スクリーンショット 2019-06-21 18.07.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/ee69354e-008e-8d11-0177-729971f5d65d.png">
セットアップ手順から例に記載されている**curlリクエスト**をコピーして試しにIncoming Webhooksだけで通知を確認
<img width="600" alt="スクリーンショット 2019-06-21 18.10.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/c0ee6937-be60-1a21-b6af-7262bfb0c38d.png">
<img width="600" alt="スクリーンショット 2019-06-21 18.10.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/c617a5a5-654c-eabc-3f11-a7f20cbba65c.png">
これだけでもテンション上がりますよねw
<img width="600" alt="スクリーンショット 2019-06-21 18.11.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/da18405f-9394-6003-564f-13b7a8204173.png">
早速GASと連携させましょう
ですがここまでは[参考にさせてもらった記事](https://qiita.com/minanami/items/9354424db32aba7e6a86)で紹介されているので詳細は省いてハマりどころを解説します
`sendToSlack`関数の**data**と引数の**channel**に設定する内容を間違えないようにさっき使った**curlリクエスト**をコメントアウトでメソッド上部に入れて調整作業すると良いです
<img width="600" alt="スクリーンショット 2019-06-21 18.14.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/361bfd9b-b462-3ab9-3eaf-eacb252b2e10.png">
実行すると次は外部サービスとの連携で認可リクエストのポップアップが表示されるので承諾するとSlackに通知がくるようになります
<img width="600" alt="スクリーンショット 2019-06-21 18.06.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/05a4889a-8b04-092d-c56c-9885ad10124b.png">
<img width="600" alt="スクリーンショット 2019-06-21 18.14.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/1fbd47c0-544c-1b5a-41d2-30efa12e923e.png">

さて、これでできたようにみえますが、このままで運用すると**メンテナンスコストが高い**のでせめて、Spreadsheetで設定関連を管理できる仕組みにしたいですね。


## Spreadsheetの設定情報を取得

まずはざっくり[公式](https://developers.google.com/apps-script/guides/sheets?authuser=1)を見ておきましょう
まず特定のスプレッドシートの取得方法はいくつかあり

- [DriveApp.searchFiles](https://developers.google.com/apps-script/reference/drive/drive-app?authuser=1#searchfilesparams)を用いるなどして取得する`open`関数
- URLの中にハッシュ化されている文字列を引数に渡して取得する`openById`関数
- 共有リンクを引数に渡して取得する`openByUrl`関数

などがありますが今回は`openById`関数または`openByUrl`関数で進めていきます
<img width="600" alt="スクリーンショット 2019-06-22 14.38.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/5062c410-04ec-a3ec-87a8-3b420b25adb8.png">
あまり管理方法に凝ってもしょうがないので今回は公式のサンプルコードをそのまま使いましょう
<img width="600" alt="スクリーンショット 2019-06-22 14.35.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/5474847d-18c7-265e-fb80-cead9eb4453c.png">

## 日付指定について

仮にファイル更新が1ヶ月よりの前のものを検知したいとします
[参考にさせてもらった記事](https://qiita.com/minanami/items/9354424db32aba7e6a86)では`new Date()`で現在時刻を取得して計算してますが汎用性が下がります
そのためSpreadsheetで日付を制御するようにすれば簡単に調整できるので以下のようにExcelの関数を上手く扱いましょう
<img width="626" alt="スクリーンショット 2019-06-21 19.01.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/1e98c90b-2971-a38d-18b3-132e80f0b199.png">
<img width="640" alt="スクリーンショット 2019-06-21 19.01.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/c159c9a1-0454-8944-8841-8b9a9c56e593.png">

## 成果物

完成系はこのようになりました。
Spreadsheetのリンクだけはハードコーディングになってますが、気になる方は`open`関数を扱うようにして上手いように調整してください。
ここで注目すべきポイントは、Spreadsheetから取得した日付情報がGASの`Date`クラスとして扱えます。
そのため、特にパースやシリアライズなどの作業すること無く、そのまま日付の計算処理ができたのでGASの魅力に圧倒されましたw
<img width="600" alt="スクリーンショット 2019-06-21 19.25.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/8cd08f98-d697-001a-78a7-4a53dc9ba08a.png">
<img width="600" alt="スクリーンショット 2019-06-21 19.26.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/b68d4752-ddb1-e784-a628-698429ee0fbc.png">
<img width="600" alt="スクリーンショット 2019-06-21 19.26.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/94ab1ee7-e8d4-4805-bf80-da3ad7715e8e.png">

### `.gs`ファイル

gistに[request_update_file.gs](https://gist.github.com/gremito/ab03181c5a706d00026c3a4c49adaf7f)をアップしました。

## 定期的に通知する設定

GASの`編集`から**現在のプロジェクトのトリガー**を選択
<img width="242" alt="スクリーンショット 2019-06-22 13.59.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/32502b92-4902-2a88-09ae-308f9e9edb76.png">
**トリガーを追加**から今回作ったGASを定期的に実行させるトリガーを作る
<img width="600" alt="スクリーンショット 2019-06-22 13.59.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/a6b377ec-6805-2367-95df-04e9a54ff4ce.png">
例えば日付が変わった瞬間に処理させたい場合
<img width="600" alt="スクリーンショット 2019-06-22 14.00.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/69ce5c01-9855-957c-7022-e00b308fe237.png">
特定の時間に指定したい場合や動作確認で数分後にトリガーさせたい場合など
<img width="600" alt="スクリーンショット 2019-06-22 14.01.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/2a16731b-8e6c-aeda-c11a-9994b45abc01.png">
保存するとリストに表示されるため設定した日時になると処理される
<img width="600" alt="スクリーンショット 2019-06-22 14.02.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82601/e222484a-7097-1964-3285-bb5e1ac64475.png">

## さいごに

個人的な感想『扱い方が分かるとGAS楽しいぞ!!』