0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【集団健康管理】みんなの検温データを毎日教えてくれるシステム

Last updated at Posted at 2024-09-25

【目次】
-きっかけは集団健康管理
-何ができるの
-作り方 1/5 ~Google Form編~
-作り方 2/5 ~Google Spreadsheet編~
-作り方 3/5 ~GASコピペ編~
-作り方 4/5 ~ひたすら承認編~
-作り方 5/5 ~GASトリガー編~

きっかけは集団健康管理

私が所属するサークルでは、コロナやインフルなどの感染症拡大を防ぐために、参加者に毎日の検温を課していたことがあります。
管理者はそのデータを毎日チェックして、体調不良者がいないか確認したり、検温していない人に検温を呼びかけたりしなくてはなりませんでした。
私もその管理者になったことがありますが、毎日何人もの検温データをチェックするのは、かなり骨のある仕事でした。
そこでこの業務を簡単にできないかと思い、Google Apps Script を利用し、このシステムを作りました!

何ができるの?

Google Form で集めた回答者の検温データに基づいて、毎日夜の11時から0時に次のようなメールが送られます。

IMG_8868 2.jpg

つまり毎日

・微熱(36.9℃以上)の可能性がある人
・高熱(37.5℃以上)の人
・検温してくれた人、人数、全体の割合

がメールで送られるわけです!

⚠️注意⚠️

・体温は半角数字のみ。
・0時10分など深夜に検温した人も、その日に検温した判定になる。

作り方 1/5 ~Google Form編~

検温データを集めるGoogle Formを作りましょう!

・名前と体温の項目を聞きます。(両方必須の質問にしておくいいかも)
・送信(Send)で、フォームのURLを作成して、専用のライングループやスラックのチャンネルなどに流してください。

スクリーンショット 2024-09-25 21.37.12.jpg

作り方 2/5 ~Google Spreadsheet編~

データを貯蓄するスプレッドシートを作成しましょう!

フォームの「回答」のところから「スプレッドシートで表示」を選択し、新しくGoogle Spreadsheet を作成しましょう!

回答を集計するシートについて

・シートの名前を「フォームの回答1」から「temperature」にしてください。
スクリーンショット 2024-09-25 21.34.54 2.jpg

人数を記載するシートについて

・新たなシートを作成し、名前を「member_num」としてください。
・B1のセルに検温対象者全員の人数を入力してください。

全体の人数に対する、検温してくれた人の割合を出すのに使います!

スクリーンショット 2024-09-25 21.41.24 2.jpg

作り方 3/5 ~GASコピペ編~

検温データの分析や、メールの送信をするシステムを作りましょう!

・スプレッドシートの「拡張」から「Apps Script」に飛んでください。
・スクリプトエディタに書いてある既存のコードを消して、下のコードをそのまま貼り付けてください。

//関数 temperature_analysis に基づいて、毎日メールを送る関数;
function temperature_sendMail(){

  //メールの送信先を指定してください。
  var recipient = '*************************'

  //微熱の体温を設定してください。
  var binetsu_taion = 36.9

  //高熱の体温を設定してください。
  var konetsu_taion = 37.5

  //データの読み込み
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadsheet.getSheetByName('temperature');

  //今日の日付を取得
  var today = new Date();
  var today_str = String(Utilities.formatDate(today, 'JST', 'yyyy/MM/dd'))
  var row_number = 0;
  var lastRow = sheet.getLastRow()
  var times = 0;
  var day
  var day_str

  for(let j = 2; row_number == 0; j++){
    day = sheet.getRange(j,1).getValue()
    day_str = String(Utilities.formatDate(new Date(day), 'JST', 'yyyy/MM/dd'))
     if(day_str == today_str){
      row_number = j;
     }
     if(times == lastRow){
      break
     }
     times = times+1
  }

  //検温してくれた人がいれば体温の調査を実行。いなければその旨をメールで送信。  
  if(row_number!=0){
    temperature_analysis(row_number,recipient,binetsu_taion,konetsu_taion)
  }else{
      const subject = '検温結果報告';
      var body = '検温してくれた人はいませんでした。';

      //メールを送信;
      GmailApp.sendEmail(recipient,subject,body); 
  }
  
}

//みんなの検温データを分析;
function temperature_analysis(row_number,recipient,binetsu_taion,konetsu_taion) {

  //必要なデータの読み込み;
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadsheet.getSheetByName('temperature');
  const member = spreadsheet.getSheetByName('member_num');
  const lastRow = sheet.getLastRow();


  //検温の対象となる人数をスプレッドシートから読み取る;
  var member_num = member.getRange(1,2).getValue()

  //体温が高い人を検知;
  var binetsu_names = [];
  var konetsu_names = [];

  for(let i = row_number; i <= lastRow; i++){

    //binetsu_taion以上高い体温の人を微熱の可能性ありとして抽出;
    if(sheet.getRange(i,3).getValue() >= binetsu_taion){
      binetsu_names[binetsu_names.length] = sheet.getRange(i,2).getValue()+':'+String(sheet.getRange(i,3).getValue());
    }

    //konetsu_taion以上の体温の人を高熱として抽出;
    if(sheet.getRange(i,3).getValue() >= konetsu_taion){
      konetsu_names[konetsu_names.length] = sheet.getRange(i,2).getValue()+':'+String(sheet.getRange(i,3).getValue());
    }
  }

  if(binetsu_names.length == 0){
    binetsu_names = '該当者はいません。'
  }

   if(konetsu_names.length == 0){
    konetsu_names = '該当者はいません。'
  }

  //今日検温してくれた人をリストアップ
  var todays_names = []
  for(let k = row_number; k <= lastRow; k++){
    todays_names[todays_names.length] = String(sheet.getRange(k,2).getValue())
  }
  var yes_kenon = todays_names

  //検温してくれた人の人数
  var yes_kenon_num = yes_kenon.length

  //検温してくれた人の割合
  var yes_kenon_ratio = Math.floor((yes_kenon_num/member_num)*100)

  
  //メールの中身;
  const subject = '検温結果報告';
  var body = '微熱の可能性あり('+String(binetsu_taion)+'℃以上の人)↓ \n'+String(binetsu_names)+'\n\n高熱('+String(konetsu_taion)+'℃以上)の人↓\n'+String(konetsu_names)+'\n\n検温したのは'+String(member_num)+'人中'+String(yes_kenon_num)+'人: 全体の'+yes_kenon_ratio+'%↓\n'+String(yes_kenon);

  //メールを送信;
  GmailApp.sendEmail(recipient,subject,body); 
}

コピペしたら
・メールアドレスを入力してください。
・必要に応じて、微熱や高熱の基準となる体温を変更してください。
・保存してください。(ctrl+s or command+s)

作り方 4/5 ~ひたすら承認編~

実行をすると求められる承認を、ひたすらしていきます。

・左上の「実行」を押すと、「承認が必要です」と出るので、「権限を承認」を選択
・ポップアップが出てきたら、自分のGoogleアカウントを選択
・別のポップアップが出てきたら「許可」を選択

「このアプリはGoogleで許可されてません」...?

・「詳細」を選択してください。(「安全なページに戻る」ではない!!!!)
・さらに「安全ではないページに移動」してください。
・別のポップアップが出てきたら「許可」を選択

怖がらなくても大丈夫です!手順をちゃんと踏めば間違いなく実行できます!!

最後にプログラムを実行して、最初のようなメールがしてしたメールアドレスに届いているか確認してみてください!

作り方 5/5 ~GASトリガー編~

いよいよ最後!夜11時から0時に実行される設定を行いましょう!

・左側にある時計のマークから、トリガー(Triggers)へ移動してください。

スクリーンショット 2024-09-25 21.38.51.jpg

・右下にある「トリガーを追加(Add Trigger)」を選択してください。

スクリーンショット 2024-09-25 21.39.01.jpg

・下のように設定してください!

▶︎ 実行する関数を選択 → temperature_sendMail
▶︎ 実行するデプロイを選択 → Head
▶︎ イベントのソースを選択 → 時間主導型
▶︎ 時間ベースのトリガーのタイプを選択 → 日付ベースのタイマー
▶︎ 時刻を選択 → 午後11時〜午前0時
(英語表記は写真参照)

スクリーンショット 2024-09-25 21.39.52.jpg

これで

完成です!!

お疲れ様でした!!
健康にお気をつけて〜〜〜〜!!!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?