このプロジェクトは、Google Apps Script
(以下GASとする)を使用したGoogleChat自動送信システムです。
質問と提案などはここでお願いします。
※使用、コードの修正などはMITライセンスを使用してください。
標準のGoogleChatには、時間を指定してメッセージを送信する機能が存在しません。(標準機能では)
そのため、GAS
を使用したチャット自動送信システムを作成しました。
全ての関数は、主にこの関数を基本として動作しています。
この関数を1分ごとにトリガーで自動実行させることによって、スプレッドシートに保存された自動送信データを確認してメッセージを送信します。
-
データを縦に1行ずつ確認していき、確認メールを送信済みor送信済みでないこととメッセージを送信する時間になったかを確認します。
-
送信時間になった場合、文章の一番最後に
<hide>
が含まれていたら、匿名として送信者のメールアドレスは非表示になります。
詳しくはこのページに書きました。
- すべての行を探索し終わったら実行を終了します。
ここで、スプレッドシートに保存されているデータはこの形式で保存されています。
エラーメッセージを細かく場合分けした関数です。場合分けは以下の通りです。
状況 | 方法 |
---|---|
送信文字数が4000文字以上の場合 | 送信内容が4000文字を超えています。送信内容を短くしてください。 |
送信予定時間が過去の場合 | 送信予定時間が過去(2分前より過去)です。送信予定時間は未来になるようにしてください。 |
送信予定時間が1ヶ月以上先の場合 | 送信予定時間が1か月以上先です。送信予定時間は1か月よりも最近にしてください。 |
処理が終了すると、スプレッドシートに確認メールを送信済みor送信済み
フラグが保存されます。
Googleformの送信時に実行できるトリガーがあることとトリガーをプログラムで制御できることが分かったので、いつか修正します。
エラーメッセージを送信するための、メッセージ設定関数です。
タイトル:予約できませんでした
送信されるメッセージ
詳細:<送信が不可能な理由>
もう一度予約を行ってください。
このメッセージは自動送信されています。
返信しないでください。
エラーメッセージを送信する関数です。
タイトル:自動送信予約の詳細
送信されるメッセージ
予約者:<メールアドレス>
送信内容:<送信する予定の内容>
送信予定時間:<送信する予定の時間>
webhookURL:<送信するWebhookURL>
予約コード:<未完成なため、現在特に機能はありません。送信取り消し機能などをつける予定です。>
予約が完了しました。
ご利用ありがとうございます。
このメッセージは自動で送信されています。
返信しないでください。
日付を変換する関数です。
data
を入力すると、
YYYY-MM-DD HH:mm:ss
の形でデータが返されます。
length
の長さのコードを生成する関数です。
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
の中から、指定された文字の長さのコードを返します。
generate_Code(10)
の時点で839,299,365,868,340,224
通り(およそ839京)あります。
そのため、よほどの事が起こらない限り、2つは一致しないと思います。
送信関数の一般化関数です。
対応する変数の一覧は以下の通りです。
to |
subject |
body |
---|---|---|
メッセージの送信先を表します。完全な形式で書いてください。例:[email protected] |
メッセージのタイトル(件名)を表します。 | 送信するメッセージの本文を表します。 |
2つ重要なことがあります。この先はしっかり読んでください。
スクリプトプロパティの「sendemail」に送信するメールアドレスを設定してください。
スクリプトプロパティはの設定は、ギヤマークの「プロジェクトの設定」の一番下にあります。
例えば、[email protected]から確認メッセージを送信したい場合は以下のように設定してください。
プロパティ | 値 |
---|---|
sendemail |
[email protected] |
この関数は、使い方によっては非常に危険な関数です。
GoogleWorkspaceには書いていなかったのですが、連続した1人のユーザーにメッセージを送信することによって、送信したアカウントがbanされます。(されかけました)
実験では、25回連続で送信したところでbanされました。
これらの理由は、Gmailのスパム防止にあると考えています。
これらの解決方法として以下の案があります。(実装していません)
- スプレッドシートに送信済みのメールアドレスを保存しておいて、それらには限度に達したら送信しなくする。
運用方法は非常に簡単です。
以下の方法で全く同じものが作成できます。
-
「このフォームでは、すべての回答者からのメールが自動的に収集されます。」を選択します。
-
1つめの質問に、「責任は、ユーザーにあります」と入力します。
-
2つめの質問に、送信する内容を入力させるための質問を作成します。
-
3つめの質問に、送信する時間を入力させるための質問を作成します。
-
4つめの質問に、送信するWebhookを入力させるための質問を作成します。
-
スプレッドシートとフォームを連携させます。
-
トリガー「1分に1度実行」で
send_Scheduled_Messages()
を選択します。 -
トリガーを承認することで使用できます。
これらの作成したフォームに、適切な回答をすることで指定したGoogleChatに指定した時間でwebhookから自動送信することができます。
まだまだこのプロジェクトは、開発途中なのでバグも追加したい機能もかなりあります。
しかし、時間が取れないのでアイデアだけ書きます。
現在、悪意があるユーザーが何度もフォームに回答することで、管理者をbanさせることが可能になっています。
これらの危険をなくすために以下の機能を追加します。
- スプレッドシートに送信済みのメールアドレスを保存しておいて、それらには限度に達したら送信できなくする。
現在、このプロジェクトは非常に非効率な方法(常時稼働)で動作しています。
1分間隔で実行すると、すぐにトリガー制限(実行回数の上限)に引っかかってしまいます。
そのため、フォーム送信時
にトリガーを時間実行で設定したいと考えています。