飲み会の精算を忘れるのでGASを使いGoogleカレンダーの内容からGoogleタスクを自動作成してみた

<!-- 書く前に気をつけること -->
<!-- ・まずタイトル、次に見出し(なるべく短く1行以内)を決めて文書構成を固める -->
<!-- ・余計なことを書かない -->
<!-- ・ひとつの文にはひとつの意味を -->
<!-- ・漢字をひらく(不必要に漢字を使いすぎない) -->



# はじめに
<!-- なぜこの記事を書こうと思ったのか。 誰に向けた記事なのか。-->

こんにちは。
最近は兼務もあって仕事の種類が多岐にわたり、自分は何屋なのかふわふわしている市野です。

そんな自分でも部門に関わらず発生するイベントがあります。そう、飲み会です。みなさんは飲み会の精算はちゃんとできていますか？ 自分は酔っ払うと支払ったことを忘れがちなのですが、先日今年分の未回収額を計算したら8万ほどになっていました、、

というわけで今後は忘れないように自動で精算のTODOを作るシステムを作ってみました。

# 補足

飲み会はGoogleカレンダー内の飲み会用予定表に記載されており、予定表内はすべて飲み会の予定となっています。そのため今回は予定のフィルタリング処理は考慮していません。

# 構成

構成は非常にシンプル。Googleカレンダーから当日の予定を取得&予定があればタスク作成、という処理を1日1回GAS上で実行するというものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135313/b824e18e-2c07-7888-a36c-4b59794be905.png)

# 準備

## 1. カレンダーIDの確認

予定を取得するカレンダーのIDを控えておきます。

1. Googleカレンダーを開く
2. 左メニュー>対象カレンダーの3点リーダー>設定と共有
3. 左メニュー>カレンダーの統合>カレンダーID

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135313/08858319-6861-9ef8-859a-509c7ab29950.png" width="280px"/>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135313/35e09071-4afa-7259-46eb-78e64e41441e.png)

## 2. タスクリストIDの確認

タスクを作成するタスクリストのIDも控えておきます。(デフォルトだと「マイタスク」と表示されているやつです)

公式のAPIリファレンスから確認できます。
https://developers.google.com/tasks/reference/rest/v1/tasklists/list

1. 上記リファレンスにアクセス
2. 右メニュー>API>Execute

# 作り方

## 1. GASの作成

適当な名前でGoogle Apps Scriptを作成します。ご参考までに私が実行しているコードです。

```js
const CALENDAR_ID = "〓カレンダーIDを入力〓";
const TASK_LIST_ID = "〓タスクリストIDを入力〓";

const now = new Date(Date.now() + ((new Date().getTimezoneOffset() + (9 * 60)) * 60 * 1000));

function getTodayEventTitles(cal) {
  return cal.getEventsForDay(now).map(evt => evt.getTitle());
}

function craeteTodo(title) {
  // 期限を3日後の12時に設定
  const due = new Date(now.getTime());
  due.setDate(now.getDate() + 3);
  const dueStr = Utilities.formatDate(due, "JST", "yyyy-MM-dd") + "T12:00:00.000Z";
  Logger.log(dueStr);

  const task = {
    'title': title + "の精算",
    'notes': '',
    'due': dueStr
  };
  Tasks.Tasks.insert(task, TASK_LIST_ID);
  Logger.log(`予定（${title}）の精算タスクを作成しました`)
  
  return;
}

function main() {
  const cal = CalendarApp.getCalendarById(CALENDAR_ID);
  let events = getTodayEventTitles(cal);

  if (events.length == 0) {
    Logger.log(`${Utilities.formatDate(now, "JST", "yyyy/MM/dd")}は飲み会予定がありません`);
    return;
  }

  for (let eventTitle of events) {
    craeteTodo(eventTitle);
  }
}
```

## 2. Google Tasksサービスの呼び出し

上で用意したGASを開いた状態で、
左メニュー>サービス>Tasks APIを選択。


## 3. コードの定期実行の設定

最後にmain関数が毎日実行されるように設定します。

1. GASスクリプトを開く
2. 左メニュー>トリガー>トリガーの作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135313/ed9961f8-89b7-cb41-c4fa-59d3502294bb.png)

# 結果

`getTodayEventTitles()`を実行すると以下のようにイベントが取得できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135313/7fa6b559-c94f-973b-f456-821163a0b92a.png)

`main()`が実行されるとGoogleタスクが作成されていました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135313/9d52ee8e-4ba6-c2b2-8b71-f30a8af22210.png" width="360px"/>

# 終わりに
<!-- 書いてみての考察。 良かった点、悪かった点、次回への意気込み等。 -->

こういったちょっとしたものを作るのにGASは手軽だし便利ですね。Googleエコシステムフル活用でとても簡単に実装できました。コード量も2,3十行程度で、構想から実装まで2,3時間といったところ。飲み会の精算にお困りの方はぜひ損失を出す前に参考にしてみてください。

# 参考文献

* https://taibonn.com/gsuite/gas-auto-add-tasks/
* https://qiita.com/YasumiYasumi/items/adf0068c7c87331e13ec

<!-- 最後にもう一度チェック -->
<!-- ・誤字脱字 -->
<!-- ・図で表現できる部分がないか -->
<!-- ・注釈を活用しよう -->