見出し画像

GoogleChatに予約投稿&予約送信!GoogleフォームとGASの活用で送信時間の悩みを解消!

GIGA端末の導入から数年がたち、職員間の連絡をGoogleチャット等のチャットツールへ移行している学校も増えてきているのではないでしょうか。

Googleチャットは職員間連絡を効率化するために、非常に有用なツールですが、予約投稿ができないという弱点があります(2024年1月現在)。

そのため、
・Googleチャットで職員に連絡したいけど、すでに勤務時間外
・明日の朝投稿したいけど、投稿するのを忘れてしまうかもしれない
などのケースで「思いついたときに翌朝の投稿をセットしておく」という使い方ができません。

今回は、Googleフォーム+Googleスプレッドシート+GASを活用することで、疑似的に予約投稿を実現するための方法をご紹介します。
※今回は、毎朝8時に投稿する設定にしてあります


(1)今までの校内連絡

そもそも、なぜGoogleチャットで予約投稿したいか少しお話しておきたいと思います。

最大の目的は、職員間連絡の手段をGoogleチャットに集約することで、連絡の効率をアップさせ、伝達ミスや確認ミスを減少させたいと思っているからです。

これまで、学校の職員室では、複数の連絡手段が並立していました。

今までの連絡手段

連絡手段が多いと、確認するものも多く、見落としや伝達ミスが発生するリスクが高まります。

そのため、連絡手段をある程度集約する必要があると感じていました。

口頭は、詳細に確認できる一方相手が見つからなければ情報を伝達できないですし、付箋やメモは相手がその場に行かないと情報が伝わりません。

校務支援ソフトは、個人情報を取り扱える一方で、閲覧できる場所が限られています。

GoogleClassroomやGoogleチャットを使うと、相手の場所や状態に関わらず、必要な情報を伝えることが可能です。また、通知があるため見落としを防ぐことができます。

特にGoogleチャットは、チャットツールの良さを生かして非同期で素早くコミュニケーションをとることが可能であるため、個人情報を含まない職員間の連絡ツールをGoogleチャットに集約したいと考えました。
※個人情報を含むような情報は、校務支援ソフトを使用します。

乱立する連絡手段を2つに集約
内容によって使い分ける

(2)ClassroomではなくGoogleチャット

職員間の連絡にGoogleClassroomを活用している学校もあると思います。が、個人的にはClassroomよりもGoogleチャットが向いていると考えています。

Classroomを職員連絡で使う際には、以下のメリット・デメリットがあるためです。

GoogleClassroomを職員連絡に使うメリット・デメリット

Classroomには、カレンダーやドライブがつくられるなどの良いところがある反面、通知や既読が分かりにくいなどのデメリットもあります。

また、職員が多い学校では全員を教師として招待できないため、通知が来ない・権限が異なる等の不便があります。

以上の理由から、"カレンダーやドライブのために、職員用のClassroomは作成するが、職員連絡には使わないという運用がよい"と考えています。

(3)Googleチャットを使う際の3つの課題

連絡手段を集約するためには、職員間の連絡にClassroomを使っている先生にGoogleチャットに移行してもらわなければいけません。

そのためには、ClassroomにはできてGoogleチャットにはできないことをクリアしていく必要があります。僕が課題と感じたのは以下の3つです。

課題① 予約投稿ができない

1つ目の課題は、今回のタイトルにもなっている予約投稿ができないという点です。

特に、勤務終了後や勤務時間前に、チャットを送ることについてはいろいろな考えの方がいるので、予約投稿が使えないと不便です。

Classroomでは、予約投稿することができるのでここがクリアできないと、GoogleClassroomを使いたがる先生が出てしまい、連絡手段の集約ができません。

今回は、Googleフォームとスプレッドシート、GASを組み合わせて使うことでこの課題をクリアしていきます。

課題② 複数ファイル添付

2つ目の課題は、複数のファイルを添付することができないという点です。

Classroomは一つの投稿に対して、複数のファイルを添付できますが、Googleチャットは一つのみです。
※フォルダを共有することはできる

通常投稿の際は、(少し手間ですが)複数回投稿を行えば必要なファイルを添付できますが、予約投稿ではこれをクリアしなければいけません。

予約投稿では、Googleフォームとスプレッドシート、GASを組み合わせて使うことでこの課題をクリアしていきます。

課題③ 資料のカテゴライズ

3つ目の課題は、資料のカテゴライズができないという点です。

Classroomは、資料をトピックごとに分類して投稿することができるため、資料の管理がしやすいように見えます。

Classroomの「授業」タブで投稿できる種類

このように資料を分類してストックしておく機能は、Googleチャットにはありません。

一方で、チャットには投稿されたファイルを順に並べてくれるファイルタブや、ファイルの検索をする機能があります。

ファイルでは、添付されたファイルの一覧を見ることができる
ファイルを検索することもできる

これらの機能を活用して添付ファイルを探せば、必要なデータに素早くアクセスすることは可能です。

以上、3つの課題をクリアする方法を考えたところで、実際にどう運用するか考えていきます。

(4)ファイル連携とGASの動作

今回は、下の図のような形で予約投稿を実現します。

予約投稿の全体図

まずは、Googleフォームで予約投稿に必要になる情報を集めます。

フォームで収集したデータは、スプレッドシートに出力し、予約投稿で使用できるようにデータを整理し、形式を整えます。

あとは、GASを使って指定のChatスペースに投稿する動作になっています。

(5)使い方と設定・GASのコード

ここでは、実際に使う際の設定手順をもう少し具体的に紹介します。
手順は、以下の通りです。

〈ファイルの作成・設定手順と使い方〉
① Googleフォームを作成する
② スプレッドシートのコピーを作成する
③ 回答をスプレッドシートに出力する
④ スプレッドシートのデータ形式を整える
⑤ 予約投稿したいGoogleチャットのスペースにWebhookを設定する
⑥ GASのコードを貼り付ける
⑦ GASのコード内に必要情報を記入
⑧ 動作するか確認
⑨ トリガーの設定

※最初は自分一人のChatスペースで動作確認をするといいと思います

① Googleフォーム作成する

まずは、予約投稿に必要な情報を収集するためのGoogleフォームを作成します。
※フォームは下のものと同じものを作成してください

② スプレッドシートのコピーを作成する

(6)の方法でスプレッドシートのリンクを入手したら、「コピーを作成」をクリックして、マイドライブにスプレッドシートのコピーを作成してください。

コピーを作成する

③ 回答をスプレッドシートに出力する

①で作成したGoogleフォームの回答が、②で作成したスプレッドシートに出力されるように設定します。

Googleフォームの「回答」タブを開き、「スプレッドシートにリンク」をクリックします。

回答の送信先は、「既存のスプレッドシートを選択」を選びます。

既存のスプレッドシートを選択して
②で作成したスプレッドシートを選択する

④ スプレッドシートのデータ形式を整える

Googleフォームとスプレッドシートがリンクしたら、スプレッドシートを操作し、データ形式を整えます。

1枚目のシートの名前を変更する
整理用シートのC1セルを選択してクリック

⑤ 予約投稿したいGoogleチャットのスペースにWebhookを設定する

次は、予約投稿したいGoogleチャットのスペースにWebhookを設定します。

Googleチャットのスペースを開き、アプリと統合をクリック。

アプリと統合をクリック

Webhookを追加を押します。

Webhookを追加を選択

⑥ GASのコードを貼り付ける

Webhookの追加が終わったら、再度スプレッドシートに戻りGASを設定します。

拡張機能から「Apps Script」を選択

配付データにコードが残っていると思うので確認してください。コードが残っていなかった場合、以下のコードを貼り付けてください。
※生成AIに書いてもらったものなので、冗長なところがあったらすみません

// スプレッドシートのIDを指定する
var spreadsheetId = "スプレッドシートのID";

// シート名を指定する
var sheetName = "Googleチャット予約投稿用";

// WebhookのURLを指定する
var webhookUrl = "WebhookのURL";

// スプレッドシートの内容をチャットに投稿する関数(セルごとに分割投稿型)
function postToChat1() {
  // スプレッドシートのシートを取得する
  var sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheetName);

  // C列の最終行を取得する
  var lastRow = sheet.getLastRow();

  // C列の値を配列として取得する
  var values = sheet.getRange(2, 3, lastRow - 1).getValues();

  // C列の値をループして処理する
  for (var i = 0; i < values.length; i++) {
    // C列の値が空でない場合
    if (values[i][0] != "") {
      // C列の値をメッセージとして投稿する
      var message = values[i][0];

      // メッセージをオブジェクトに変換する
      var payload = {
        text: message,
      };

      // POST時のオプションを設定する
      var options = {
        method: "post",
        contentType: "application/json",
        payload: JSON.stringify(payload),
      };

      // WebhookのURLにPOSTする
      UrlFetchApp.fetch(webhookUrl, options);

      // D列からH列までの値をループして処理する
      for (var j = 1; j < 6; j++) {
        // セルの値が空でない場合
        if (sheet.getRange(i + 2, j + 3).getValue() != "") {
          // セルの値をメッセージとして投稿する
          var message = sheet.getRange(i + 2, j + 3).getValue();

          // メッセージをオブジェクトに変換する
          var payload = {
            text: message,
          };

          // POST時のオプションを設定する
          var options = {
            method: "post",
            contentType: "application/json",
            payload: JSON.stringify(payload),
          };

          // WebhookのURLにPOSTする
          UrlFetchApp.fetch(webhookUrl, options);
        }
      }
    }
  }
}

// トリガーを設定する関数
function setTrigger() {
  // 現在の日付を取得する
  var date = new Date();

  // 翌日の8:00に設定する
  date.setDate(date.getDate() + 1);
  date.setHours(8, 0, 0);

  // 実行したい関数名を指定する
  var functionName = "postToChat1";

  // 既存のトリガーを削除する
  deleteTrigger(functionName);

  // 時間主導型のトリガーを作成する
  ScriptApp.newTrigger(functionName)
    .timeBased()
    .at(date)
    .create();
}

// トリガーを削除する関数
function deleteTrigger(functionName) {
  // プロジェクトのトリガーを取得する
  var triggers = ScriptApp.getProjectTriggers();

  // トリガーをループして処理する
  for (var i = 0; i < triggers.length; i++) {
    // 実行する関数名が一致する場合
    if (triggers[i].getHandlerFunction() == functionName) {
      // トリガーを削除する
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }
}

⑦ GASのコード内に必要情報を記入

貼り付けたコードを狙いどおりに動作させるためには、コード内の
・スプレッドシートのID
・WebhookのURL
の2か所に必要情報を入力する必要があります。

コードの一番上の2か所に情報を入力

スプレッドシートのIDには、②で作成したスプレッドシートのURLから

https://docs.google.com/spreadsheets/d/ と /editの間にある値を抜き出して入力します。

WebhookのURLは、⑤で設定したGoogleチャットスペース内の図の部分からコピーして、入力します。

アプリと統合をクリック
リンクをコピーして、コード内に貼り付ける

⑧ 動作するか確認

ここまで来たら、ほとんど完了です。実際に動作するか確認してみましょう。

①で作成したGoogleフォームを開き、右上のプレビューをクリック

プレビューをクリック

投稿日を今日の日付にして、送信します。添付ファイル等も試してみるとよいと思います。

〈添付ファイルについて〉
添付ファイルを設定する場合は、
・資料をGoogleドライブにアップロード
・権限の設定を行う
・ファイルのURLを貼り付ける

という手順で設定を行ってください。

権限設定の例:リンクを知っている同じ組織内で共有
動作確認する時は、投稿日を今日の日付にする

Googleフォームとスプレッドシートがきちんと設定されていれば、スプレッドシートの「Googleチャット予約投稿用」というシートに、回答した内容が反映されているはずです。

入力内容が反映されているのを確認したら、拡張機能からApps Scriptを開き、実行を押します。

実行を押す

実行を押すと、権限の許可を求められるので許可をしてください。

正しく動作すれば、指定したGoogleチャットスペースに、Webhook経由で投稿されるはずです。

こんな感じで投稿される

⑨ トリガーの設定

動作の確認ができたら、次はトリガーの設定を行って毎日同じタイミングで投稿されるように設定します。

拡張機能から、Apps Scriptを開き、トリガータブ→トリガーを追加と進みます。

トリガーを選択して
トリガーを追加
トリガーをセットして、保存をクリック

これで、午前10時になるとsetTriggerが動き、翌日8:00にpostToChat1によってチャットスペースに投稿するようにトリガーがセットされます。

以上で、使い方と設定の説明は終わりです。先ほども書きましたが、組織で使う際は、自分しかいないチャットスペースでいろいろと試してから導入するとよいと思います。

(6)データの配付

データの配付は、Googleフォームを使う方法に変更しました。

上の記事をよく読んでいただき、記事内のGoogleフォームからお問い合わせください。

(7)まとめ

今回は、Googleチャットに職員間連絡を集約したい理由と、そのための課題を解決する方法、特に予約投稿を実現する手段を紹介してきましたが、いかがだったでしょうか?

デジタルツールを使いこなして仕事効率をアップさせ、教員の本当に大切な仕事に多くの時間を使えるようになることを願っています。

今回の記事が、みなさんの参考になれば幸いです。

【最近のおすすめ記事】

【その他マガジンの紹介】

今後も学校の業務効率化やICT活用について記事にしていく予定ですので、関心のある方はマガジンのフォローをお願いします。

また、育児休業や学校の先生が生活で考えたこと、旅行の記録についても記事にまとめています。そちらも興味があればぜひご覧ください。

改めて、最後までご覧いただきありがとうございます。
記事が気に入っていただけたらスキお願いします!
感想や質問があれば、コメントいただけると嬉しいです。

この記事が参加している募集

AIとやってみた

#創作大賞2024

書いてみる

締切:

この記事が気に入ったらサポートをしてみませんか?