見出し画像

Google Apps Scriptを使って欠席連絡フォームを作ってみる(4完結)

こんにちは。高校で情報の先生をしていますTakitoです。
ご高覧いただきありがとうございます。
Google Apps Script(GAS)を使った欠席連絡フォームの作成記録です。
前回はGoogleフォームの送信時に、送信内容を本文に記載してメールが送信されるようにしました。

今回は、1-1組の生徒の欠席連絡が届いたら、1-1組の担任にメールが送信される仕組みを作りました。
技術的な話で言えば、Googleスプレッドシートで「担任データ」を作って、Googleフォームからの送信内容のうち、「クラスデータ」を読み取って、「担任データ」のクラスと照合。クラスが合致した担任のメールアドレスへメール送信できるようになりました。

function myFunction(e) {
  const items = e.response.getItemResponses();
  const subject = '欠席連絡';
  let target_class = '' ;
  let body = '';
  
  for (let i = 0; i < items.length; i++) {
    let item = items[i];
    body += item.getItem().getTitle() + ': ' + item.getResponse() + '\n';
    if(i == 0){
      target_class = item.getResponse() ;
    }
  }
  
  const address_Sheet = SpreadsheetApp.openById("スプレッドシートID").getSheetByName("シート名");
  const lastRow = address_Sheet.getLastRow();
  const data = address_Sheet.getRange(1, 1, lastRow, 3).getValues();
  
  for(let j of data ){
    if(j[0] == target_class){
      email = j[2];
      body = j[1] + '先生への連絡\n\n' + body ;
      GmailApp.sendEmail(email, subject, body);
    }     
  }
  
}

前回のコードからだいぶ変わってます。
新しく作った部分を記録しておきます。
コードがそこそこの長さになってきたので、左側に行番号でる機能あるといいな。

1.Googleスプレッドシートで担任データを作成

特に工夫もなくサクッと作成。1-3組のメールアドレスはチェック用のメールアドレスにしてあるので黒塗り。

ちなみに担任名は「名前 生成」でGoogle検索して出てきた、名前自動生成ツールで作りました。実在の人物ではありません。

2.対象クラスの読み取り(9~11行目)

if(i == 0){
  target_class = item.getResponse()
}

1つ目の質問を取り出して、メール本文を作る時に、
ついでに変数target_classにクラス名を入れておく。

3.スプレッドシートの読み込み(14~16行目)

const address_Sheet = SpreadsheetApp.openById("スプレッドシートID").getSheetByName("シート名");
const lastRow = address_Sheet.getLastRow();
const data = address_Sheet.getRange(1, 1, lastRow, 3).getValues();

SpreadsheetApp.openById("スプレッドシートID") でスプレッドシートを指定する。スプレッドシートIDはスプレッドシート開いた時のURL「https://docs.google.com/spreadsheets/d/●●●●●●●●●●●●●●●●●●/」
の●●の部分。さらに.getSheetByName("シート名");でシートを指定する。
シート名はスプレッドシートのシートタブに記載の名前。日本語でも大丈夫。読み込んだスプレッドシートは変数address_Sheetに代入。

.getLastRow()を使って、読み込んだスプレッドシートの最終行が何行目かを確認。変数lastRowに代入する。

address_Sheet.getRange(始まりの行, 始まりの列, 読込行の数, 読込列の数)でスプレッドシートの読込範囲を指定する。行数は入力された担任の数によって変わるので、先ほどのlastRowを使う。他の値は変わらないので実数。
.getValues();を使って各行のデータを[ [1-1] , [羽森 大聖] , [aaa@bbb.com] ]のように二次元配列として読み取って変数dataに代入。

4.スプレッドシートから対象クラスの情報を読み取る

for(let j of data ){
  if(j[0] == target_class){
    email = j[2];
    body = j[1] + '先生への連絡\n\n' + body ;
    GmailApp.sendEmail(email, subject, body);
  }     
}

for(let j of data )はdataに代入したスプレッドシートの内容を1行ずつ確認し、dataが無くなるまで(最後の行)まで繰り返す。
j[0](スプレッドシートのクラス)と変数target_classが合致した場合、j[2](スプレッドシートのメールアドレス)を変数emailに代入して、ついでにj[1](スプレッドシートの担任名)も取得してメール本文へ追記。
最後に変数email宛にメールを送信。
「担任データ」の全ての行を確認し、変数target_classとスプレッドシートのクラスが一致すれば送信するので、同じクラスの先生が2名以上いても(担任と副担任のイメージ)両方に同じメールが送られる。

5.動作確認

最後に動作確認。欠席フォームからデータを送信して・・・

メールを確認。上手く動作した。

目的の動作ができたので一応完成にします。次の記事は全体をまとめて、
欠席連絡フォームシリーズは終わり。

いいなと思ったら応援しよう!