【GAS】Google Classroom のストリームにリンクを付けて投稿する【定期投稿】

2021年6月10日プログラミング

知人から「毎日定時にGoogle Classroomにリンクを投稿したいんだけど」と相談されたので作ってみました。

Google Classroomには、決めた日時に自動で投稿する「予約投稿」はあるのですが、定期的に投稿する「定期投稿」はないみたいですね。

GAS(Google Apps Script)のトリガー機能を使って実現してみました。

ソースは参考サイトから引っ張って来てますが色々改造してます。

仕様

スプレッドシートに、

  • クラス名
  • 投稿する文章
  • リンク

を入力してスクリプトを実行すると、Classroomのストリームにリンクを付けて投稿できます。

クラス名は実行するGoogleアカウントでアクセスできるクラス名の一覧から検索されます。

GASのトリガー機能を利用して定期的に投稿します。

スプレッドシートを作る

B1 に投稿したいクラス名を入力します

B2 に投稿の文章を入力します

B3 にリンクのURLを入力します。

他は適当に。

Google Classroom API サービスの設定

GASからClassroomを扱う為には「Classroom API」の追加が必要です。

スプレッドシートのツールからスクリプトエディタを開いて、左にあるサービスの+をクリックします。

一覧にある「Google Classroom API」を選択して追加して下さい。

サービスの下に「Classroom」が表示されればOKです。

GASのプログラムを入力

コードエディタへ下のソースをコピペします。

//Google Classroom のストリームにリンクを付けて投稿する
function myFunction() {

  //スプレッドシートから投稿する情報を取得
  var spreadsheet = SpreadsheetApp.getActive();
  var className = spreadsheet.getRange('B1').getValue();
  var postMessage = spreadsheet.getRange('B2').getValue();
  var linkUrl = spreadsheet.getRange('B3').getValue();

  //空文チェック
  if (postMessage == "") {
    console.log("文章は省略できません。");
    return;
  }

  //クラスIDの取得
  var response = Classroom.Courses.list();
  var courses = response.courses;
  var target = 0;
  for (i = 0; i < courses.length; i++) {
    if (courses[i].name == className) {
      var target = courses[i].id;
      break;
    }
  }

  //クラス名チェック
  if (target == 0) {
    console.log("クラスが見つかりません。");
    return;
  }
  console.log("name = " + courses[i].name + "   target = " + target);

  //投稿内容の生成
  var data = {
    "courseId": target,
    "text": postMessage,
    "assigneeMode": "ALL_STUDENTS",
    "state": "PUBLISHED"
  };

  //リンクの追加
  if (linkUrl != "") {
    data.materials = [{
      "link": {
        "url": linkUrl
      }
    }];
  }

  //投稿
  Classroom.Courses.Announcements.create(data, target);
}

試しに実行してみる

ソースを保存したら、取り合えず実行してみます。

実際に投稿される直前まで(投稿しない状態)のテストを行いたいなら、52行目をコメントアウトして下さい。
//  Classroom.Courses.Announcements.create(data, target);
※本番前に一度は実際に投稿のテストを行った方が良いと思います。

初回の実行ではアプリの承認が必要になります。

承認出来たら、実行ボタンを押しましょう。

投稿の結果はこんな感じ。

名前の後ろのカッコにはGASのプロジェクト名が入ります。

トリガーの設定

左にあるトリガーを開き、右下の「+トリガーを追加」でトリガーを追加する。

トリガーの設定は、実行する関数を指定し、イベントソースを時間主導型に変更。

トリガーのタイプや時刻は適当に設定。

設定して保存したら、あとは待つだけ。

うまく動かない場合は

ログを見てみましょう。

開始時間を確認してトリガーで実行できているか確認。

クリックするとログが出るので、投稿先のクラス名を確認。

プログラム解説

興味のある人向けに簡単な解説。

投稿する情報を取得

  //スプレッドシートから投稿する情報を取得
  var spreadsheet = SpreadsheetApp.getActive();
  var className = spreadsheet.getRange('B1').getValue();
  var postMessage = spreadsheet.getRange('B2').getValue();
  var linkUrl = spreadsheet.getRange('B3').getValue();

  //空文チェック
  if (postMessage == "") {
    console.log("文章は省略できません。");
    return;
  }

スプレッドシートのB列から投稿するデータを取得している。

本文が無いと投稿時にエラーになるので入力が無い場合は止める。

クラスIDの取得

  //クラスIDの取得
  var response = Classroom.Courses.list();
  var courses = response.courses;
  var target = 0;
  for (i = 0; i < courses.length; i++) {
    if (courses[i].name == className) {
      var target = courses[i].id;
      break;
    }
  }

  //クラス名チェック
  if (target == 0) {
    console.log("クラスが見つかりません。");
    return;
  }
  console.log("name = " + courses[i].name + "   target = " + target);

実行するGoogleアカウントでアクセスできるクラス名(コース)の一覧を取得し、入力されたクラス名と比較している。

クラス名が見つかったらtargetにクラスID(コースID)を入れる。

クラス名が見つからない場合はクラスIDが取得できないので止める。

最後にクラス名とIDをログに出力している。(投稿先確認用)

投稿内容の生成

  //投稿内容の生成
  var data = {
    "courseId": target,
    "text": postMessage,
    "assigneeMode": "ALL_STUDENTS",
    "state": "PUBLISHED"
  };

  //リンクの追加
  if (linkUrl != "") {
    data.materials = [{
      "link": {
        "url": linkUrl
      }
    }];
  }

投稿内容をオブジェクトにセットしている。

セットする内容はClassroom APIのドキュメントに載ってる。

リンクは空白だとエラーになるので、チェックしてから追加している。

投稿

  //投稿
  Classroom.Courses.Announcements.create(data, target);

生成したデータを投稿。

最後に

色々書いてきましたが、スクリプトを実装したスプレッドシートのリンクを貼っておきます。

開くとコピーする画面になりますので、コピーしてお使い下さい。

では良いGASライフを~

参考サイト

0

2021年6月10日プログラミング

Posted by ikaken