【即日導入可】 Slack × スプレッドシート× カレンダー でリマインダー付きチームタスク管理

ある日、天からお達しが、、、

>天の声 「なんか四半期に一回のタスクとか、年次タスクって結局ぎりぎりになるまで誰もやらないよね。
>　　　　てかそもそも言われるまで待つみたいなスタンスすらあるよね。」
>
>私 　　「まぁーそうですね。みんな忙しいっすからねー。他に気を配る余裕がないんじゃないっすかねー」
>　　　　（テキトー）
>
>天の声 「じゃ、みんなが意識できる分かりやすい管理方法作ってくれる？毎回割り振るのも疲れたし。
>　　　　タスク書き出しておけば通知してくれる的なやつで。あ、もちろんお金かけないでね」
>
>私 　　「~~ふざけんじゃ~~・・・はい、かしこまりましたー！」
>

#ということで作りました

**Slack** × **Googleスプレッドシート** × **Googleカレンダー**で**リマインダー機能付きのチームタスク管理ツール**です。

全体的な処理の流れは
↓の動きを自動化、[Google Calendar for Team Events](https://slack.com/intl/ja-jp/help/articles/360047938054-Slack-%E5%90%91%E3%81%91-Google-Calendar-for-Team-Events)で日次・週次サマリとしてSlackに通知させるという感じです。
実装後はスプレッドシートにタスクを書き込むだけなので、ITに疎いメンバーがいても手軽に導入できます。

![sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116581/b553a79d-d514-1f2b-6b20-08e9ad256909.gif)


では、さっそくいきましょう！

## 1. スプレッドシートにタスクを書き出す
下記のような構成でスプレッドシートにタスクを書き出します。
※B2セルから入力してください。(タスクの入力はB3以降)

カレンダーへの連携はより詳細に指定できますが、今回は省略します。
とりあえず週の予定とその日の予定がサクッと分かればよいので。


![スクリーンショット 2020-12-13 0.35.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116581/dc3d4874-46cd-e6c4-7d4d-f682cc7205ac.png)


## ２. GASで連携処理を記述する

タスクを記入したら、`[ツール]` → `[スクリプトエディタ]`の順にクリックします。

スクリプトの編集画面が起動するので、下記のコードをまるっと貼り付けてください。
プロジェクト名は適当なものでOKです。


```javascript:setSchedule.gs
// カスタムメニューを生成(onOpenはスプレッドシート表示の際に実行される)
function onOpen() {
  
  var ss = SpreadsheetApp.getActiveSpreadsheet();
 
  // 「カレンダー登録」というメニューをセット(「実行」したらsetScheduleが起動)
  var subMenus = [];
  subMenus.push({
    name: "実行",
    functionName: "setSchedule"
  });
  ss.addMenu("カレンダー登録", subMenus);
}
 
// カレンダーにスケジュールを登録する処理
function setSchedule() {
  // ※ここに自分のカレンダーIDを入力する
  const calendarId = "XXXXXXX@group.calendar.google.com";
  // googleカレンダー取得
  var calender = CalendarApp.getCalendarById(calendarId);
  // シート取得
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  
  // 開始列(固定)
  const startCol = 2;
  // 最終列(固定)
  const lastCol = 4;
  // 開始行(固定)
  const startRow = 3;
  // 最終行
  var lastRow = sheet.getLastRow();
  
  // 記載した予定を取得
  var schedule = sheet.getRange(startRow, startCol, lastRow, lastCol).getValues();
 
  // 取得した行数分カレンダー登録処理を回す
  for (i = 0; i <= lastRow - startRow; i++) {
 
    // 日時取得
    var day = new Date(schedule[i][0]);
    // タイトル取得
    var title = schedule[i][1];
    // カレンダー登録ステータスを取得
    var status = schedule[i][2];

    // カレンダー登録欄が「済」もしくは予定日が空の場合はスキップ
    if (status == "済" || schedule[i][0] == "") {
      continue;
    }
 
    
    try {
      // 予定を作成
      calender.createAllDayEvent(
        title,
        new Date(day)
      );
      
      // 無事に予定が作成されたら「済」にする
      sheet.getRange(startRow + i, lastCol).setValue("済");
 
    // エラー出たらログ出力
    } catch(e) {
      Logger.log(e);
    }    
  }
  // ブラウザへ完了通知
  Browser.msgBox("終了");
}
```

処理をざっくり説明すると、
スプレッドシートに書き込んだタスクを読み込み → 指定したカレンダーに連携する
という感じです。
カレンダーIDは自身が作成したものを入力してください。（カレンダーの[設定]から確認できます）


## 3. スプレッドシートとカレンダーの連携を確認する

スプレッドシートに戻り、ページをリフレッシュすると、
下のように「カレンダー登録」というメニューが追加されていると思います。
`[カレンダー登録]` → `[実行]`で連携を確認します。


![スクリーンショット 2020-12-13 1.32.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116581/a1b4aaed-ca98-e79c-74ad-7d1ee887b96d.png)


※「このアプリは確認されていません」と表示がされた場合、`[詳細]` → `[XXX (安全ではないページ) に移動]` → `[許可]`と選択してください。
再度 `[カレンダー登録]` → `[実行]` とするとカレンダーへの連携が確認できると思います。

![sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116581/b553a79d-d514-1f2b-6b20-08e9ad256909.gif)



## 4. 連携処理を自動化する

連携を確認したら、処理を自動化しましょう。
自動化は[Apps Script](https://script.google.com/home)のホーム画面から設定できます。

作成したタスク右側にある```・・・```から
 `[トリガー]` → `[+ トリガーを追加]` をクリックしたら、下記の通りに値をセットします。

![スクリーンショット 2020-12-13 2.28.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116581/0c57104e-e8b3-92a2-00ce-15392b229aac.png)
![スクリーンショット 2020-12-13 2.28.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116581/145aac8b-6fac-ea37-08a3-4c130636f853.png)

これで毎日0〜1時に処理が起動し、記入したタスクをカレンダーに自動登録してくれます。
「済」フラグで登録を管理しているので、重複することもありません。

## 5. カレンダーの予定をSlackに通知する

ここまできたら、あとはSlack通知できるようにするだけです。
やり方はSlackに「[Google Calendar for Team Events](https://slack.com/intl/ja-jp/help/articles/360047938054-Slack-%E5%90%91%E3%81%91-Google-Calendar-for-Team-Events)」というアプリを追加し、通知条件をセットするだけ。

Slackにアプリを追加したら、連携するカレンダー・通知するチャンネルを選択、
ページ下部のデイリーサマリとウィークリーサマリにチェックを入れ保存してください。

![スクリーンショット 2020-12-13 2.41.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116581/daaac784-da83-763d-c46e-93ff635533b3.png)


以上で作業は完了です！
設定した時間になると、下記のように通知されるようになります。
（下はウィークリーの通知画面）

![スクリーンショット 2020-12-13 3.08.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116581/f244f696-73de-2529-8efc-56e74948305e.png)


いまどきタスク管理アプリはたくさんありますが、
みんなで使うときはこういうシンプルなものが良い時もありますよね！
ということで、よければ皆さんも試してみてくださーい！