【たった2ステップ】"Slackチャンネル参加→googleカレンダーに自動招待"のやり方！【簡単】

# 要約
### 簡単にわかる実装概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621333/9c4def6c-f80c-4e45-b510-e5b07d31e99a.png)

GoogleAppScript(GAS)次第でカレンダー自動招待以外にも、docsの権限付与や、gmailの自動送信もできちゃいます！

# はじめに
### slack関連のあるある？

```
僕「週次開催するLT会用のチャンネル作ったぞ〜」
参加者A,B,C,D,......(続々と参加)
僕「人が増えるたびにLT会のgoogleカレンダーに招待しなきゃいけないの地味に大変......」
```
ちょっとした手間暇だけど、積み重なると大変ですよね......。
この記事ではこのようなお悩みを自動化して万事解決できるようにすることを目指します！

### この記事の趣旨
**slack参加者に対して自動でgoogleカレンダーを招待**

面倒なことは全部ワークフローとGASにやらせよう！

# 自動化の説明
手動であれ、自動化であれチャンネル参加者をGoogleカレンダーに登録するには以下の流れがあります。

- チャンネル参加者の情報を取得する
- 得た情報をもとにGoogleカレンダーに招待する

では、自動でGoogleカレンダーの招待をする場合、いったい何の情報が必要なのでしょうか？
まずはGoogleカレンダーの自動招待から考えていきましょう。

**◇ どのようにGoogleカレンダーに招待するか？**
GoogleではGoogleのサービスを自動化するための言語とそのプラットフォーム(GAS)が提供されています。
今回なら**メールアドレス**さえわかれば、GASで書いたコードを実行することで、Googleカレンダーに招待できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621333/91454509-811c-d48c-c439-1aaf63bf85ce.png)


ではそのメールアドレス（チャンネル参加者の情報）をどこから手に入れれば良いのでしょか？

**◇ どのようにチャンネル参加者のメールアドレスを取得するか？**
実はとても簡単です。
slackの機能（ワークフロー）でチャンネル参加者のメアドをスプレッドシートに記載することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621333/7358dfa9-0b9e-5b86-e2f3-4beabe8a1d34.png)

ここまでくるとゴールは近くです。
あとは、**スプレッドシートに書かれたタイミング**で、
**メールアドレスをGASのコードが受け取り実行されれば終わり**です。

**◇ どのように自動化する？**

スプレッドシート、つまりGoogleのサービスが絡むならGASの出番です。
GASでは、スプレッドシートの追記をトリガーに、その値を使ってコードを自動実行することが可能です。
つまりは以下のような流れが可能となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621333/0be1f17b-f276-d89f-b516-7d1a3256d516.png)

以上が自動化の流れとなります。

# 実際にどう実装するの？
### STEP1：スプレッドシートにメアド記載するワークフローの作成
#### 手順１　スプレッドシートの準備

まずはメールアドレスを記載する用のスプレッドシートを用意しましょう。
次にメールアドレスを取得できるよう、スプレッドシートにメールアドレスのカラムを追加しましょう。
（<font color="red">注：ここで"メールアドレス"のカラムを追加しないと、後でslackワークフローで選択できるカラムがなくなっちゃうので必ず書きましょう</font>）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621333/f2476022-b941-76f0-f9ba-646371c3ae7a.png)


#### 手順2　ワークフローの作成

次にチャンネルに人が参加したら、スプレッドシートに名前が追加されるようなワークフローを作りましょう。

下記の画面から「誰かがチャンネルに参加した時」をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621333/91b6808a-d873-0664-3122-47797dc17904.png)
そうすると次の画面に遷移します。
ここでチャンネル参加後のアクションを決めましょう。
右のバーから「GoogleSheet」→「スプレッドシートに追加する」を選択します。
<p>
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621333/49447cde-4b94-23fb-f50f-17e2821e8daa.png" alt="image1" style="width: 50%;"/>
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621333/a7c71598-0eca-f97b-9367-97a598a487e0.png" alt="image2" style="width: 50%;"/>
</p>

すると以下のような画面に遷移されます。
先ほどのスプレッドシートを選択し、メールアドレスのカラムにユーザのメールアドレスを入れるようにしましょう。
![dFfOUtKWMv98wrZ1705284567_1705284602.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621333/d86eec53-08ae-a1cf-a76a-497c3c82fe0d.png)
ここまでくれば、ユーザのチャンネル参加時にスプレッドシートにそのユーザのメアドが追加されるはずです！

### STEP2：スプレッドシートに記載されたメアドをカレンダーに自動招待するGASの作成

#### 手順1　GASのページへ遷移

スプレッドシートの左上にある「拡張機能」→「AppScript」をクリック。
以下の画面に遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621333/cb3d0993-ee64-1c2b-9c6e-4c12bfc72294.png)

#### 手順2　googleカレンダのイベントIDを取得

GoogleカレンダーのイベントにはイベントIDなるものが存在します。
このイベントIDをもとに人を追加するので、まずはイベントIDを調べましょう。
以下がGoogleカレンダーのイベントIDを調べるサンプルコードです。
(スプレッドシートの場合はurlにシートIDが記載されていますが、GoogleカレンダーのURLには記載されていません。なのでこの方法で調べます。)
```javascript
function myFunction() {
  const calendar = CalendarApp.getDefaultCalendar();
  // まずは該当イベントを検索
  // イベントを日付範囲と名前で探します
  const startTime = new Date('December 1, 2023 00:00:00');
  const endTime = new Date('December 31, 2023 23:59:59');
  const options = {
   search: 'example-event', //ここにはイベント名を入れてください
  };
  const events = calendar.getEvents(startTime, endTime, options);
  console.log(events[0].getId());
}
```
コピペした後は上部にある「▶︎実行」をクリックしましょう
そうするとコンソール上に以下の内容が出力されます。
![TnkCcUDnH0MTTfk1705045340_1705045411.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621333/c3977cba-aacb-4617-ef70-cef0e4e51bef.png)
この@以前の英数字列がカレンダーのイベントIDとなります！

#### 手順3　イベントにユーザを自動追加するGASを作成

それではイベントIDがわかったので次はスプレッドシートから自動追加するコードを書きましょう。
以下がサンプルコードになります。
```javascript
function addAttendeeToEvent(eventObject) {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const changedRange = eventObject.range;
  const lastRow = sheet.getLastRow();
  const emailColumnIndex = 1; 

  const attendeeEmail = sheet.getRange(lastRow, emailColumnIndex).getValue();
  if(!attendeeEmail) {
    console.log('ユーザの削除イベントを検知しました. カレンダーの編集は行いません. ')
    return;
  }

  const calendar = CalendarApp.getDefaultCalendar();
  const eventId = 'ここには該当コードを書き込んでください';

  const event = calendar.getEventById(eventId);
  if(!event) {
    console.log('IDに該当するイベントがありませんでした. ')
    return;
  }

  event.addGuest(attendeeEmail);
  console.log('参加者の追加に成功しました. ')

  return;

}

```
先ほどと同様にこのコードをもとに記載してください。

#### 手順4　トリガー設定

スプレッドシートのメールアドレスのカラムに追加されたら、このコードが自動実行されるようにトリガーを設定しましょう！
左端にあるバーから「トリガー」→右下にある「+トリガーを追加」を選択しましょう

![UzfE5Tb9fiJy2Cb1705045527_1705045551.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621333/7a2ba22b-ef70-13fa-3225-4c0b87ffe0f5.png)

トリガーは、"どのような条件"で`どの関数`を実行できるかが選択できます。
"スプレッドシートが変更された時"に`addAttendeeToEvent`が実行されるようにしましょう。

これで完成です！


# まとめ
「slackのワークフロー」→「GASを用いたGoogle Workspaceの操作」
今回の話の根幹はこれです。
これの汎用性はめちゃくちゃ高いです。
今回のgoogleカレンダーへの招待だけでなく、GooleDocsの権限付与などもできちゃいます。

何か不明な点などがあれば、遠慮なくコメントしてください