カテゴリー
 管理者向けサンプル

Google Apps Script で Classroom の教師不在クラスを確認

このサンプルでは、Google スプレッドシートに教師不在のクラスを抽出して、アーカイブまたは削除などをするスクリプトです。

以下のリンクからサンプルシートがコピー可能です。Google Workspace の管理者アカウントで実行してください(ご自身のアカウントの権利のあるもののみ実行可能です)。

画像の説明 教師不在 Classroom の確認シート
※スプレッドシートをコピーするGoogle アカウントが必要です。


利用手順の詳細については、「利用方法」シートにも記載があります。
<免責事項>
サンプルコードについて:このコードは、Google Apps Script の機能を理解するためのサンプルとして提供されるものです。お客様の環境や目的に合わせてカスタマイズが必要な場合があります。
ご利用について: このサンプルスクリプトの利用は、お客様の責任において行ってください。このスクリプトの使用によって生じるいかなる損害についても責任を負いかねます。

①「利用方法」シート内の以下のボタンを押下して「 Classroom メニュー」を追加してください。

初めて利用される場合、以下の各承認画面が表示されます。
2回目以降は、ボタンを押した直後に「 Classroom メニュー」が追加されます。

下記のポップアップが表示されたら、「OK」を押下してください。

アカウントの選択画面が表示されたら、実行する管理者アカウントを選択してください。

アクセスのリクエストの表示がされたら、表示の下部まで移動してください。

「許可」を押下してください。次にスクリプトが実行されるので、完了すると「Classroom メニュー」追加されます。

②シート「コース情報」内で「Classroom メニュー」を開いてください。
シート内のデータが何もないことを確認した上で、「Classroom 情報取得」をクリックし実行してください。

③「出力された結果一覧の「教師名」と「教師のメールアドレス」がブランクになっていることをご確認ください。

④学生情報を確認したいクラスについては、A列に「☑」を入れて「Classroom メニュー」の「学生情報」をクリックしてください。

処理が完了すると、「学生情報」のシートにデータが追加されます。

⑤「アーカイブ」、「アクティブ」、「削除」について
処理対象のクラスのA列に「☑」を入れて、ご希望のメニューをクリックしてださい。
※「削除」した場合は、復元することができません。ご注意ください。

カテゴリー
 管理者向けサンプル Uncategorized

Google スプレッドシート から 管理デバイスのリストを取得し、一括デプロビジョニング

このサンプルでは、Google スプレッドシートに管理対象のデバイスをリストし、一括でデプロビジョニングするスクリプトです。

以下のリンクからサンプルシートがコピー可能です。Google Workspace の管理者アカウントで実行してください(ご自身のアカウントの権利のあるもののみ実行可能です)。

Workspace 管理デバイスシート ※スプレッドシートをコピーするGoogle アカウントが必要です

まずはスプレッドシートの「ChromeOS」シートの左上の「デバイス一覧を取得する」をクリックして、テナントにエンロールされているデバイスのリストを表示します。

「deprovision」シートに、デプロビジョニングしたいデバイスのdeviceIdをコピーしてはりつけます。Userには管理者アカウントである、ログインしているアカウントを記入します。デプロビジョニングの用意ができたら、「デプロビジョニング」をクリックします。スクリプトが実行され、デバイスがデプロビジョニングされます。成功した場合はDeprovision statusに「Complete」が表示されます。

管理コンソールもしくは、再度スプレッドシートの「ChromeOS」タブのデバイス一覧を取得する、からリストを取得し、該当のデバイスのstatusが「DEPROVISIONED」になっているのを確認します。

PRE_PROVISIONED のステータスのデバイスをデプロビジョンすることはできません。

カテゴリー
 管理者向けサンプル

Google スプレッドシート から Google フォーム を作成

このサンプルでは、Google スプレッドシート に試験問題をリストし、そこから Google フォーム のテストを作成する方法をご紹介します。

以下のリンクからサンプルシートがコピー可能です。まずはサンプルで利用したい Google アカウント を選択し、スプレッドシート をコピーしてお使いください。

Google フォーム の操作サンプル ※スプレッドシートをコピーする Google アカウントが必要です

スプレッドシート をコピーしたら、適当な質問をリストし、以下のテスト作成ボタンをクリックしてください。その後 Google ドライブ を確認すると、テストのフォーム が作成されています。

<応用編>

それではここから一歩進んで、100題などの問題をスプレッドシート にリストしておき、その中から好きな数の問題数をランダムに抽出してフォーム を作成することをシミュレーションしたスプレッドシート を作成してみたいと思います。以下から別のサンプルをコピーしてください。

Google フォーム の操作サンプル – ランダム抽出対応 ※スプレッドシートをコピーする Google アカウントが必要です

先程はボタンにスクリプトを実行する機能を追加していましたが、メニューに追加する方法もあります。以下のスクリプトをコピーしてスプレッドシート についている Google Apps Script の コード.gs の先頭に貼り付けてみます。

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  var menu = ui.createMenu('テスト作成');
  menu.addItem('すべての問題でフォーム を作成', 'createForm1');
  menu.addItem('ランダムに問題選択', 'selectQuestions');
  menu.addItem('問題抽出シートからフォーム を作成', 'createForm2');
  menu.addToUi();
}

function createForm1(){
  ShtName = 'フォームテスト';
  CreateTestForm(ShtName);
}

function createForm2(){
  ShtName = '問題抽出シート';
  CreateTestForm(ShtName);
}

保存し、スプレッドシート のほうをリロード、もしくはファンクションの onOpen を選択して実行してみてください。これはシートが開かれたときに実行されるイベントハンドラ(何かのイベントで実行される機能)ファンクションです。

こちらはメニューバーにアイテムを追加するスクリプトです。以下のようにメニューが追加されたのがわかるかと思います。

・すべての問題でフォーム を作成:createForm1(すべての問題でフォーム を作成)

・ランダムに問題選択:selectQuestions (N2の黄色のカラムに入った数値分の問題を出現回数の低い順に選択して「問題抽出シート」に記述)

・問題選択からフォーム を作成: createForm1(「問題抽出シート」からフォーム を作成)

次に、「フォームの URL 」のタブには、作成されたフォーム のURL がアップデートされるように以下のコードを

Browser.msgBox(FormTitle+’の作成が完了しました。\\nフォームは Google Drive の『ドライブ』に存在します。’);

の直前に記入してみましょう。

 // フォーム作成完了表示
  var sht3 = SpreadsheetApp.getActive().getSheetByName("フォームのURL");
  
  sht3.getRange(1,2).setValue(Form.getPublishedUrl());
  sht3.getRange(2,2).setValue(Form.getEditUrl());

これでフォーム が作成された際、ドライブ にいかなくても、スプレッドシート の「フォーム のURL」のタブからURLのリンクがわかるようになりました。

完成したスクリプトのついたスプレッドシート はこちらです。

Google スプレッドシートからフォームを作成(応用編・改修版) ※スプレッドシートをコピーするGoogle アカウントが必要です

カテゴリー
 管理者向けサンプル

Google スプレッドシートから Google カレンダー に予定を出力

このサンプルでは、Google スプレッドシートで予定を入力し、Google カレンダーに出力するコードを記載しています。

以下のリンクからサンプルシートがコピー可能です。まずはカレンダー反映したいGoogle アカウント を選択し、スプレッドシート をコピーしてお使いください。

Google カレンダーの操作サンプル ※スプレッドシートをコピーするGoogle アカウントが必要です
予定をGoogle カレンダー で確認する

スプレッドシート をコピーしたら、適当な日付に予定を入力し、以下の出力ボタンをクリックしてください。その後カレンダーのリンクを確認すると、予定が反映されています。

<応用編>

1.カレンダー ID の認識

スプレッドシートから任意のカレンダーに出力します。

まずはカレンダー ID を確認します。自分のカレンダーはカレンダーの設定から「カレンダーの統合」を開くと載っています。

もっと簡単に先程のスプレッドシート の Apps Script からこれを確認する方法もあります。

まずは以下のスクリプトを先程コピーしたスプレッドシートのメニューの拡張機能>Apps Scriptで開いてみましょう。

すでにコードが書かれていますが、その下に以下のコードをはりつけて、以下のアイコンから保存します。

/**
 * Lists the calendars shown in the user's calendar list.
 * @see https://developers.google.com/calendar/api/v3/reference/calendarList/list
 */
function listCalendars() {
  let calendars;
  let pageToken;
  do {
    calendars = Calendar.CalendarList.list({
      maxResults: 100,
      pageToken: pageToken

    });
    if (!calendars.items || calendars.items.length === 0) {
      Logger.log('カレンダーがありません。');
      return;
    }
    // Print the calendar id and calendar summary
    for (const calendar of calendars.items) {
      Logger.log('%s (ID: %s)', calendar.summary, calendar.id);
    }
    pageToken = calendars.nextPageToken;
  } while (pageToken);
}

左側のサービス からGoogle Calendar API を選択して追加します。

次に上部のメニュー上から listCalendars のファンクションを選び実行します。

スクリプトの下部の実行ログに、カレンダーの名前とIDが表示されます。

2.任意のカレンダーに予定を書き出すようにスクリプトを変更

開いているスクリプトの15行目の以下の部分を書き換えます。これでデフォルトのカレンダーではなくカレンダーIDで指定しているカレンダーへの書き出しを指示します。

let Calendar = CalendarApp.getDefaultCalendar();
          ↓
let Calendar = CalendarApp.getCalendarById();

次に実行ログで出てきたカレンダー ID をコピーして、以下の部分に ” ” のコテーションマークとともに入力します。あるいは入力した文字を選択しながらShift + 2 をしても、文字列として認識します。

getCalendarById(CALENDAR_ID);
↓
getCalendarById(”abcdefg”);

プロジェクトを保存して、スプレッドシートに戻り、日付部分の出力ボタンを押すか、メニューから Convert2Calender を実行すると、今度は別のカレンダーに予定が反映されます。カレンダーから予定が反映されているか確認ができます。

<おまけ – カレンダーの予定をスプレッドシートに書き出し>

最後にカレンダーの予定をスプレッドシートに書き出してみましょう。

最初にコピーしたスプレッドシートにシートを1枚追加します。

Apps Script に戻って一番下に以下のコードを貼り付けてみましょう。

以下の部分は適当に書き出したい期間を変更します。

const startTime = new Date(‘2022/04/01 00:00:00’); //スプレッドシートに書き込みたい期間のはじめの日付を変更して記述
const endTime = new Date(‘2022/12/01 00:00:00’);//スプレッドシートに書き込みたい期間の終わりの日付を変更して記述

function getCalendarEvents() {
  var mySheet=SpreadsheetApp.getActiveSheet(); //シートを取得
  const CALENDAR_ID = 'xxxxxxxxxxx'; //カレンダーIDを取得
  
  //ヘッダを入力
  mySheet.getRange("A1").setValue("イベント名");
  mySheet.getRange("B1").setValue("開始時間");
  mySheet.getRange("C1").setValue("終了時間");
  mySheet.getRange("D1").setValue("イベント登録者名");

  const calendar = CalendarApp.getCalendarById(CALENDAR_ID);  
  const startTime = new Date('2022/04/01 00:00:00'); //スプレッドシートに書き込みたい期間のはじめの日付を変更して記述
  const endTime = new Date('2022/12/01 00:00:00');//スプレッドシートに書き込みたい期間の終わりの日付を変更して記述
   
  const events = calendar.getEvents(startTime, endTime);
  const values = [];
  
  for(const event of events){
    const record = [
      event.getTitle(),
      //event.getStartTime(),
      Utilities.formatDate(event.getStartTime(),"GMT+0900","yyyy年MM月dd日 HH時mm分") ,//文字列に変換
      //event.getEndTime(),
      Utilities.formatDate(event.getEndTime(),"GMT+0900","yyyy年MM月dd日 HH時mm分"),//文字列に変換
      event.getCreators()[0]
    ];
    values.push(record);
  }
 
  SpreadsheetApp.getActiveSheet().getRange(2, 1, values.length, values[0].length).setValues(values);
}

前と同様、カレンダー ID は表示したいものを入力します。保存して getCalendarEvents 関数を選び、実行します。

スプレッドシート上に該当する期間のカレンダーの内容が反映されているかと思います。

カテゴリー
 管理者向けサンプル

管理者向けサンプルの使い方

管理者向けサンプルでは、Google Workspace for Education のデータを Google スプレッドシートから Google Apps Script で操作する方法をご紹介します。ここで扱うサンプル ソースコードはそれぞれリンクされているGitHub ページからダウンロードが可能で、またそれぞれのページの以下のロゴのリンクからApps Script 付きのスプレッドシートがコピー可能です。

スプレッドシートをコピーするには Google アカウントが必要です。学校のアカウントでアクセスが制御されている場合などは Gmail アカウントでお試しください。

その他 Apps Script のサンプルは以下のリンクにも用意があります。
Apps Script Sample > GitHub

カテゴリー
 管理者向けサンプル

Classroom API

このサンプルでは、Google Classroom でのクラスの作成、編集についての Google Apps Script のコードを記載しています。ここで扱うサンプル ソースコードは  こちら(github.com) からダウンロードできます。

以下のリンクから Google Classroom を操作するサンプル スプレッドシートがコピー可能です。まずは Classroom の設定を行っている Google アカウント を選択し、スプレッドシートをコピーしてお使いください。

Google Classroom の操作サンプル ※スプレッドシートをコピーするGoogle アカウントが必要です
コース(クラス)を Google Classroom で確認する

Google Classroom の操作

コース(クラス)一覧の取得

登録済みのコース(クラス)の一覧を取得します。

/**
* コース一覧の取得
*/
function getCourseList() {

  // シート名を指定してスプレッドシート を取得
  let spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = spreadsheet.getSheetByName('Classroom Info');

  // シート内のコンテンツをクリア
  sheet.getDataRange().clear();

  // 1行目 - ヘッダー出力
  let line = [
    'role',
    'id',
    'name',
    'section',
    'description',
    'room',
    'ownerId',
  ];
  let range = sheet.getRange(2, 1, 1, line.length);
  range.setValues([line]);

  // 教師・学習者それぞれ取得
  const roles = ['teacher', 'student'];
  for (let roleIndex=0; roleIndex<roles.length; roleIndex++) {
    let param = {};
    // 自分が担当・所属するコースを指定
    param[`${roles[roleIndex]}Id`] = 'me';

    // コース一覧を取得
    let response = Classroom.Courses.list(param);

    if (response) {

      // レスポンスからコース一覧を取得
      let courses = response.courses;

      if (courses) {

        for (let courseIndex=0; courseIndex<courses.length; courseIndex++) {
          // 結果をシートに出力
          line = [
            roles[roleIndex],
            courses[courseIndex].id, // コースID
            courses[courseIndex].name, // コース名
            courses[courseIndex].section, // セクション
            courses[courseIndex].description, // 説明
            courses[courseIndex].room, // 教室
            courses[courseIndex].ownerId, // 担当教師(オーナー)
          ];
          range = sheet.getRange(3+courseIndex, 1, 1, line.length);
          range.setValues([line]);
        }
      }
    }
  }
}

登録済みのコース(クラス)の一覧を取得し、結果をスプレッドシートに出力します。

クラスの作成

新しいクラスを作成します。

/**
* コースの作成
*/
function createCourse() {

  // 作成するコース
  let newCourse = {
    'name': 'New Class 1', // コース名
    'section': 'section I', // セクション
    'description': 'This is a new course.', // 説明
    'room': 'Room A', // 教室
    'ownerId': 'me' // 担当教師(オーナー)
  };

  // コースを作成
  let createdCourse = Classroom.Courses.create (newCourse);

  // コースのIDを返却
  return createdCourse.id;
}

クラスの名前、セクションを指定して、クラスの情報を更新します。

コース(クラス)を編集する

登録済みのコース(クラス)の情報を更新します。

/*
* コース情報の更新
*/
function updateCourseInfo(newCourseId) {

  // コースの情報
  let updateCourse = {
    'name': 'New Class 2', // コース名
    'section': 'section II', // セクション
    'room': 'Room B', // 教室
  };

  // コースの情報を更新
  let updatedCourse = Classroom.Courses.update(updateCourse, newCourseId);
}

名前、セクション、教室を変更して、コース(クラス)の情報を更新します。

課題の管理

課題の作成

指定したコース(クラス)に課題を登録します。

/**
* コースに課題を登録
*/
function createCourseWork(newCourseId) {

  // 課題の情報
  let newCourseWork = {
    'title': 'New CourseWork 1', // タイトル
    'description': 'This is a new coursework.', // 説明
    'maxPoints': 100, // 得点
    'workType': 'ASSIGNMENT', // タイプ
    'state': 'PUBLISHED', // 公開
  };

  //課題を作成
  let createdCourseWork = Classroom.Courses.CourseWork.create(newCourseWork, newCourseId);

  // 課題のIDを返却
  return createdCourseWork.id;
}

課題の内容を指定し、課題を登録します。

カテゴリー
 管理者向けサンプル

Directory API

このサンプルでは、Directory API を使った、Google Workspace for Education ドメインの管理についてGoogle Apps Script のコードを記載しています。
Google Workspace for Education のグループ、Chromebook デバイスの情報を取得するサンプルを紹介します。
ここで扱うサンプル ソースコードは  こちら(github.com) からダウンロードできます。

グループ操作

グループ一覧の取得
グループを取得する ※スプレッドシートをコピーする Google アカウントが必要です

グループの一覧を取得します。

/**
* グループ一覧の取得
*/
function getGroupList() {

  // シート名を指定してスプレッドシート を取得
  let spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = spreadsheet.getSheetByName('Group');

  // シート内のコンテンツをクリア
  sheet.getDataRange().clear();

  // 1行目 - ヘッダー出力
  let line = [
    'id',
    'email',
    'name',
    'description',
    'directMemberCount',
    'kind',
  ];
  let range = sheet.getRange(2, 1, 1, line.length);
  range.setValues([line]);

  // 自ドメインを指定
  let param = {
    'customer': 'my_customer',
    'maxResulsts': 200,
  };

  // グループ一覧を取得
  let response = AdminDirectory.Groups.list(param);
  if ( response ) {

    // レスポンスからグループ一覧を取得
    let groupList = response.groups;

    if (groupList) {

      for (let listIndex=0; listIndex<groupList.length; listIndex++) {
        // 結果をシートに出力
        line = [
          groupList[listIndex].id, // グループID
          groupList[listIndex].email, // メールアドレス
          groupList[listIndex].name, // グループ名
          groupList[listIndex].description, // 説明
          groupList[listIndex].directMemberCount, // 直接のメンバー数
          groupList[listIndex].kind, // タイプ
        ];
        range = sheet.getRange(3+listIndex, 1, 1, line.length);
        range.setValues([line]);
      }
    }
  }
}

AdminDirectory.Groups.list メソッドを呼び出します。パラメータとして、[customer] = [my_customer]を指定すると、自ドメインの情報が取得できます。

ChromeOS デバイス操作

デバイス一覧の取得
デバイス一覧を取得する ※スプレッドシートをコピーする Google アカウントが必要です

Directory API を使用して、ChromeOS デバイスの一覧を取得します。

/**
* ChromeOSデバイス一覧の取得
*/
function getChromeList() {

  // シート名を指定してスプレッドシートを取得
  let spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = spreadsheet.getSheetByName('ChromeOS');

  // シート内のコンテンツをクリア
  sheet.getDataRange().clear();

  // 1行目 - ヘッダー出力
  let line = [
    'deviceId',
    'serialNumber',
    'status',
    'model',
    'osVersion',
    'macAddress',
    'orgUnitPath',
  ];
  let range = sheet.getRange(2, 1, 1, line.length);
  range.setValues([line]);

  let param = {
    'maxResulsts': 9999,
  };

  // ChromeOSデバイス一覧を取得
  let response = AdminDirectory.Chromeosdevices.list ('my_customer', param);
  if (response) {

    // レスポンスからChromeOSデバイス一覧を取得
    let chromeList = response.chromeosdevices;
    if ( chromeList ) {

      for (let listIndex=0; listIndex<chromeList.length; listIndex++) {
        // 結果をシートに出力
        line = [
          chromeList[listIndex].deviceId, // デバイスID
          chromeList[listIndex].serialNumber, // シリアル番号
          chromeList[listIndex].status, // ステータス
          chromeList[listIndex].model, // モデル情報
          chromeList[listIndex].osVersion, // オペレーティングシステムのバージョン
          chromeList[listIndex].macAddress, // ワイヤレスMACアドレス
          chromeList[listIndex].orgUnitPath, // 組織単位
        ];
        range = sheet.getRange(3+listIndex, 1, 1, line.length);
        range.setValues([line]);
      }
    }
  }
}

AdminDirectory.Chromeosdevices.list メソッドを呼び出します。パラメータとして[my_customer]を指定すると、自ドメインの情報が取得できます。