遠隔授業(オンライン授業)で出席確認(生存確認未対応)!: GAS(Google Apps Script)でトリガーでフォーム作成 編

コンセプト

遠隔授業(オンライン授業)で出席を取ろう!の第二弾として実際にGAS(Google Apps Script)でつくってみた。
全く満足できないシンプルな出来だが、一先ずの試みとして。

考え方は簡単で、時間が来たら自動的にその日のフォームを作成して時間が来たら破棄する。
生徒にはフォームに名前と学籍番号を記入して送信するといったもの。

問題点としては誰でも記入できるので、例えば友達に頼んで記入してフォームを送ることも可能。
Googleのアカウント管理によるフォーム共有に変えれば、このあたりは基本防げると思う。

フロー

例えばクラス3つ分の出席フォームの場合のGASを作ってみた。
ループを回したりと面倒なことはせずに単純に必要な関数を呼び出しているだけです。
(コードは稚拙なのでお許しを(^^ゞ)

フローは簡単で例えば、
「毎週指定曜日になるとクラス分のフォームを作成して指定のGoogleDocページにリンクを貼る」

良く解らなかったのはGASの「時間主導型」のトリガーで「週ベースのタイマー」は1時間単位の指定のみで正確な時間が指定できないこと。
つまり.at(XXXXX) で時間を指定するとeveryWeeks(n)でエラーが出る事。
出来ないハズは無い!と思いつつ、調べても解らなかった。。
ここが簡単に指定できれば、関数が一つ減り全体もシンプルになるのだが。。

仕方なく、

選んだ方法は、 通常の週毎のイベントで特定の曜日の0~1時にweeklyAction()を呼び出して、weeklyAction()内のsetMyTrigger()で出席フォーム作成の関数を正確な時間のトリガーで作成。
※三つのクラスの出席フォームを作成しているので注意

GAS

function weeklyAction() {
  setMyTrigger();

  function setMyTrigger() {

    const time1 = new Date();
    const time2 = new Date();
    const time3 = new Date();

      //クラス出席簿関数セット
    var myClassForm1 = 'createEventForm7A';
    var myClassForm2 = 'createEventForm7B';
    var myClassForm3 = 'createEventForm7AA';

    // 実行時間の設定
    // 7A
    time1.setHours(9);time1.setMinutes(5);
    // 7B
    time2.setHours(10);time2.setMinutes(45);
    // 7AA
    time3.setHours(13);time3.setMinutes(5);
      
    // myFuncという関数を指定時刻に実行するトリガーを作成
    ScriptApp.newTrigger(myClassForm1).timeBased().at(time1).create();
    ScriptApp.newTrigger(myClassForm2).timeBased().at(time2).create();
    ScriptApp.newTrigger(myClassForm3).timeBased().at(time3).create();
  }

}

フォーム作成関数

スプレッドシートから項目を読み取ったり、Docにリンクアドレスを書き込んだりと面倒なことを行っているので、少々煩雑です。
※三つのクラスの出席フォームを作成しているので注意

スプレッドシートの内容
function allClear(){
  var doc = DocumentApp.openById("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
  var body = doc.getBody().clear();
  body.insertParagraph(0, '出欠確認フォーム   出欠は終了しました').setHeading(DocumentApp.ParagraphHeading.HEADING1);

}


function createEventForm7A(){

  const myClass="T2070B1A WEBサイトデザイン 7-A";
 
  var myDate = Utilities.formatDate(new Date(), "JST","yyMMdd");

  var excel_data = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const values = ss.getSheetByName('出欠フォーム').getDataRange().getValues();
  const formTitle = myClass; //タイトル
  const formDescription = values[1][1]; //概要

  const form = FormApp.create(myDate + "_" + formTitle);
  form.setDescription(formDescription);
  var tmpURL = form.getPublishedUrl();

  var tex1 = form.addTextItem().setTitle(values[2][1]).setRequired(true);
  var tex2 = form.addTextItem().setTitle(values[3][1]).setRequired(true);

  //edit Docs
  var doc = DocumentApp.openById("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

  var body = doc.getBody().clear();
  body.insertParagraph(0, '出欠確認フォーム').setHeading(DocumentApp.ParagraphHeading.HEADING1);
  var rowsData =  [
                    ['クラス', '出欠確認'], 
                    ['2070B1A 7-A WEBサイトデザイン', tmpURL]
                  ];

  table = body.appendTable(rowsData);
  table.getRow(0).editAsText().setBold(true);

}

///////////////////////////////////////////////////////////////
function createEventForm7B(){

  const myClass="T2070B1B WEBサイトデザイン 7-B";
 
  var myDate = Utilities.formatDate(new Date(), "JST","yyMMdd");

  var excel_data = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const values = ss.getSheetByName('出欠フォーム').getDataRange().getValues();
  const formTitle = myClass; //タイトル
  const formDescription = values[1][1]; //概要

  const form = FormApp.create(myDate + "_" + formTitle);
  form.setDescription(formDescription);
  var tmpURL = form.getPublishedUrl();

  var tex1 = form.addTextItem().setTitle(values[2][1]).setRequired(true);
  var tex2 = form.addTextItem().setTitle(values[3][1]).setRequired(true);

  //edit Docs
  var doc = DocumentApp.openById("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

  var body = doc.getBody().clear();
 body.insertParagraph(0, '出欠確認フォーム').setHeading(DocumentApp.ParagraphHeading.HEADING1);
  var rowsData =  [
                    ['クラス', '出欠確認'], 
                    ['T2070B1B 7-B WEBサイトデザイン', tmpURL]
                  ];

  table = body.appendTable(rowsData);
  table.getRow(0).editAsText().setBold(true);

}

///////////////////////////////////////////////////////////////
function createEventForm7AA(){

  const myClass="T2070B1D WEBサイトデザイン 7-A";
 
  var myDate = Utilities.formatDate(new Date(), "JST","yyMMdd");

  var excel_data = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const values = ss.getSheetByName('出欠フォーム').getDataRange().getValues();
  const formTitle = myClass; //タイトル
  const formDescription = values[1][1]; //概要

  const form = FormApp.create(myDate + "_" + formTitle);
  form.setDescription(formDescription);
  var tmpURL = form.getPublishedUrl();

  var tex1 = form.addTextItem().setTitle(values[2][1]).setRequired(true);
  var tex2 = form.addTextItem().setTitle(values[3][1]).setRequired(true);

  //edit Docs
  var doc = DocumentApp.openById("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

  var body = doc.getBody().clear();
 body.insertParagraph(0, '出欠確認フォーム').setHeading(DocumentApp.ParagraphHeading.HEADING1);
  var rowsData =  [
                    ['クラス', '出欠確認'], 
                    ['T2070B1D 7-A WEBサイトデザイン', tmpURL]
                  ];

  table = body.appendTable(rowsData);
  table.getRow(0).editAsText().setBold(true);

}

生成されたトリガー

生成されたフォーム

果たして、、作っては、みたが。。
「使えるツールです確率」は45%くらいかな。
何処かの誰か、未来の自分への覚え書です。

おすすめ