GoogleChatで予約送信を実現する

# はじめに
弊社はGoogle Workspaceを契約しているので、
コミュニケーションツールとして、GoogleChatを主に利用しています。
SlackやTeamsに比べ、物足りない部分はありますが、大きく不満はありませんでした。
ただ最近、不便だなーと感じるのが、予約送信ができないことです。

端末が持ち込めず、外部へのアクセスを制限されている環境で仕事をしているため、
リアルタイムにチャット内容の確認や返信ができないのはもちろん、
帰宅後に自社作業をすると、どうしても夜遅くなってしまい、
チャットの返信も(迷惑かなーと)躊躇してしまいます。
で、翌日朝に返信しようといつも考えているんですが、どうしても忘れがちで、
催促来るまで放置してしまう、ということが何度かありました。

Gmailは、予約送信機能があるので、業務時間外でも、深夜でも、休日でも、
何の躊躇もなくバンバン返信できるのに、なんでChatはないんだよーという不満から
今回の記事を書いています。
GoogleのサービスなんでおそらくAPIがあるから、どうにでもできるでしょう！

# どう実装するか検討
ググればサンプルソースやらQiitaやらがいっぱい出てくるんでしょうが、
それすらめんどくさいので、Geminiさんに丸投げです。

#### プロンプト
```
google chat で予約送信機能を実現したいです。
どのようなアプリが使いやすいですかね？
```

#### 回答
```
Google Chat で予約送信機能を実現したいとのことですね！

残念ながら、Google Chat には標準で予約送信機能が備わっていません。しかし、いくつかの方法で実現できます。

**1. Google Apps Script (GAS) を利用する**

Google Apps Script を利用すれば、Google Chat へのメッセージ送信を自動化できます。GAS でスクリプトを作成し、トリガー機能と組み合わせることで、指定した日時にメッセージを送信することが可能です。

* メリット: 無料で利用できる、柔軟なカスタマイズが可能
* デメリット: プログラミングの知識が必要

**2. 外部サービスを利用する**

Google Chat と連携できる外部サービスを利用する方法もあります。

* **Zapier** や **IFTTT** などのサービスを利用すれば、他のアプリと連携して Google Chat への予約送信を自動化できます。例えば、Google カレンダーの予定に合わせてメッセージを送信するといったことが可能です。
* **Chatwork** や **Slack** などのチャットツールの中には、予約送信機能を備えているものがあります。これらのツールと Google Chat を連携させることで、間接的に予約送信を実現できる場合があります。

* メリット: プログラミング不要で手軽に利用できる
* デメリット: サービスによっては有料、機能が限定される場合がある


**使いやすいアプリは？**

Google Apps Script は無料で利用でき、柔軟なカスタマイズが可能な点が魅力ですが、プログラミングの知識が必要です。

Zapier や IFTTT はプログラミング不要で手軽に利用できますが、サービスによっては有料で、機能が限定される場合があります。

Chatwork や Slack などのチャットツールは、予約送信機能が備わっている点が魅力ですが、Google Chat との連携がスムーズにいかない場合があります。

 ultimately, the best app for you will depend on your specific needs and preferences. 

**補足**

上記の方法以外にも、Google Chat の API を利用して独自にアプリを開発する方法もあります。ただし、この方法には高度なプログラミングスキルが必要です。

それぞれの方法について、メリットとデメリットを比較検討し、ご自身のニーズに合ったアプリを選んでみてください。
```

やっぱりGASですかねー。
GUI作んの(考えると)めんどくさいので、
いつもどおりSpreadsheetでデータを持たせちゃいましょう。
お願い、Gemini！

#### プロンプト
```
では、gasとspreadsheetで作りたいと思います。
したいことは、spreadsheetのA列にチャットルーム、B列にチャット本文、C列に送信日時、D列に送信ステータス(未送信/送信済)を持たせて、gasが定期的に確認し、送信を行うものを考えています。

サンプルコードをお願いします
```

#### 回答
```
承知いたしました。Google Apps Script (GAS) と Spreadsheet を使用して、Google Chat にメッセージを予約送信するサンプルコードを作成します。

Spreadsheet の構成は、以下の通りとします。

| 列 | 項目 | 説明 |
|---|---|---|
| A | チャットルーム | メッセージを送信する Google Chat のルーム名または ID |
| B | チャット本文 | 送信するメッセージの本文 |
| C | 送信日時 | メッセージを送信する日時 |
| D | 送信ステータス | メッセージの送信ステータス（未送信/送信済） |

GAS のコードは、以下のようになります。

function sendMessage() {
  // スプレッドシートを取得
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('シート1'); // シート名を適宜変更

  // 最終行を取得
  const lastRow = sheet.getLastRow();

  // 2行目から最終行までループ
  for (let i = 2; i <= lastRow; i++) {
    // 各列の値を取得
    const room = sheet.getRange(i, 1).getValue();
    const message = sheet.getRange(i, 2).getValue();
    const sendTime = sheet.getRange(i, 3).getValue();
    const status = sheet.getRange(i, 4).getValue();

    // 送信日時が現在時刻より前で、かつステータスが「未送信」の場合
    if (sendTime <= new Date() && status === '未送信') {
      try {
        // Google Chat にメッセージを送信
        sendMessageToChat(room, message);

        // ステータスを「送信済」に更新
        sheet.getRange(i, 4).setValue('送信済');
      } catch (e) {
        // エラーが発生した場合、ステータスを「エラー」に更新
        sheet.getRange(i, 4).setValue('エラー');
        Logger.log('メッセージ送信エラー: ' + e.message);
      }
    }
  }
}

function sendMessageToChat(room, message) {
  // Chat API を使用してメッセージを送信
  const url = 'https://chat.googleapis.com/v1/spaces/' + room + '/messages';
  const payload = {
    'text': message
  };
  const options = {
    'method': 'post',
    'contentType': 'application/json',
    'payload': JSON.stringify(payload),
    'headers': {
      'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()
    }
  };
  UrlFetchApp.fetch(url, options);
}

**コードの説明:**

* `sendMessage()` 関数:
    * スプレッドシートからデータを読み込みます。
    * 各行に対して、送信日時が現在時刻より前で、かつステータスが「未送信」の場合にメッセージを送信します。
    * `sendMessageToChat()` 関数を呼び出して、Google Chat にメッセージを送信します。
    * メッセージ送信後、ステータスを「送信済」または「エラー」に更新します。
* `sendMessageToChat()` 関数:
    * Google Chat API を使用してメッセージを送信します。
    * ルーム名または ID とメッセージ本文を引数として受け取ります。
    * アクセストークンを取得し、API リクエストを送信します。

**使用方法:**

1. Google Spreadsheet を作成し、上記のようにデータを記述します。
2. スプレッドシートに GAS のコードを記述します。（ツール > スクリプトエディタ）
3. `sendMessage()` 関数を実行します。
4. トリガーを設定して、`sendMessage()` 関数を定期的に実行するようにします。（編集 > 現在のプロジェクトのトリガー）

**注意事項:**

* Google Chat API を使用するには、プロジェクトで Chat API を有効にする必要があります。
* スクリプトを実行するには、Google アカウントで認証する必要があります。
* `sendMessageToChat()` 関数の `room` 引数には、Google Chat のルーム名または ID を指定します。ルーム ID は、ルームの URL から取得できます。
* トリガーの実行間隔は、ご自身のニーズに合わせて調整してください。

**その他:**

* 上記は基本的なサンプルコードです。必要に応じて、エラー処理やログ出力などを追加してください。
* Google Chat API の詳細については、公式ドキュメントをご参照ください。


このサンプルコードが、Google Chat での予約送信機能の実装に役立つことを願っています。
```

強ええぇぇ。
したいこと完全に理解したうえで回答してくれてますね。
特に送信ステータスの部分とか、具体的に指示していないのに、
サンプルソースを見ると、しっかり意図を汲んでくれています。

しかもSpreadsheetの出力機能付き。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/bf0992ce-4884-abf6-36d0-4d01ac82bb70.png)

# おわりに
ほぼ作業完了しちゃった感はありますが、
次回は実際に動かすところまで確認していきたいと思います。