餌やり当番等の分担は、いろいろな研究室で行われていると思います。毎日何時に誰が、というふうにしてしまうとなかなかしんどくなるので、普通の日は餌をやったメンバーが記入するようにしていますが、設定した当番の日(土曜日など)に、忘れた場合にリマインドメールがいくようなものをつくってみました。リマインダーが個人からいくと、送る方も送られる方もストレスを感じかねないですが、誰も気を使わず、機械が無心でリマインドしてくれる、となると、心理的負担もほぼないのではないか、というのが、オートリマインダーのメリットです。
アルファベットでメンバーを指定した日に、餌をやったことをスプレッドシートせずにトリガーで決められた時間がくると、以下のようなメールが送られます。
Dear Sir, 自動リマインダーです。本日当番のようですが、現在まで餌やり記録がありません。記入忘れも含めて、確認お願いします。もし心当たりなければお知らせ下さい。 |
【つくりかた】
1.以下のようなgoogleスプレッドシートを作ります。これ自体でただの餌やり記録シートとして運用できます。
当番を作りたい日に、当番となる人のアルファベットをいれてください。このシートの名前は、”餌やり”としてください。
その上で、同じスプレットシートファイルの、別の”シート”(一番下の「シートを追加」で追加)として、memberlistというのをつくります。そして、ここに、alphabet(メンバー固有のもの)、name、Emailを、A,B,Cに列記していってください。理論的には26人までいけるはずです。
2.これに連動させるスクリプトとして、以下に示したソースコードを用いて作成。中程、赤字になっているメールアドレスは、自分のメールアドレスに変更してご利用ください。(スプレットシートの、メニュー:拡張機能ーApps Scriptでスクリプトエディタを起動)
トリガーを忘れずに設定(GASのトリガー設定の仕方は多くのページで紹介されているのでググってください 例:https://tonari-it.com/gas-timed-driven-trigger/)
function AfternoonReminder() :Afternoonとしているけれど、朝でもなんでもOK。記入をチェックし、リマインダーを送りたい時間にトリガーを設定。
3.動作の説明
function AfternoonReminder()が、トリガー設定の時間になると動きます(2.で設定)。これのスクリプトは、スプレッドシートの”餌やり”シートにアクセスした上で、A列の今日の日付を探します。今日の日付が見つかったら、その行に対応するB列の「当番」の列を参照します。たとえば、1/14を参照すれば、sがあるので、sさんが当番だと認識します。ここが空欄なら、リマインダーはそもそも発動しません。当番が存在する日は、その横C列(餌やり済みの記録)にすでに記入してあるか確認します。ここに記入があれば、もう餌やり済み、ということで、リマインダーは行いません。
記入していない場合、sさんは誰なのか、ということを、スクリプト内のfunction lookforemail(searchValue)という関数に代入し、探します。この関数は、”memberlist”というシートを参照し、A列の上から順番にsを探していくと、3列目にみつかります。この行のC列のSxxxx@xxx.xxxが、当番のメールアドレスだと認識し、function sendaRemider2()という関数を使ってこちらにメールを送る、という流れになります。
アルファベットを全角で書いたり、当番のところに祝と書かれたりしてエラーが生じたので、そのケースにも対応し、祝と書かれたら無視すること、全角半角は同一として扱うこともスクリプトにいれてあります。
以下はソースコード。ご自由にご利用ください。赤字のところだけなおせばいいはずです。
function AfternoonReminder() {
var sheetName = "餌やり";
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(sheetName);
var today = new Date();
today.setHours(0, 0, 0, 0); // Set time to midnight for accurate comparison
var data = sheet.getDataRange().getValues();
for (var i = 0; i < data.length; i++) {
var dateInColumnA = new Date(data[i][0]);
dateInColumnA.setHours(0, 0, 0, 0);
if (dateInColumnA.getTime() === today.getTime()) {
var correspondingPerson = data[i][1].normalize('NFKC').slice(-1);
if (correspondingPerson !== "祝"){
Logger.log("Corresponding person: " + correspondingPerson);
Logger.log("Corresponding Email: " + lookforemail(correspondingPerson));
if(data[i][2] === ""){
sendaRemider2(correspondingPerson);
return correspondingPerson;
}
else
{
Logger.log ("fed");
return null;
}
}
}
}
Logger.log("Today's date not found in column A");
return null; // or any default value if today's date is not found
}
function sendaRemider2(correspondingPerson){
Logger.log(correspondingPerson);
/* 各データを準備 */
correspondingEmail = lookforemail(correspondingPerson);
var strTo=correspondingEmail; //To
var strFrom="xxxx@gmail.com"; //Fromをここに入力
var strSender="Medaka Feed Reminder"; //差出人
/* メール本文を準備 */
var strSubject="Medaka Feed Reminder";
var strBody= "\n" + "Dear Sir,\n" + "Gentle reminder. \nYou are the feeding shift today, but it does not seem to have fed according to the spread sheet log. \nPlease check the feeding, and loggin. \n(If you are not a group member, please reply to this email.)\n\n自動リマインダーです。本日当番のようですが、現在まで餌やり記録がありません。記入忘れも含めて、確認お願いします。もし心当たりなければお知らせ下さい。";
if(correspondingEmail === "")
{
return;
}
else
{
/* メールを送信 */
GmailApp.sendEmail(
strTo,
strSubject,
strBody,
{
from: strFrom,
name: strSender
}
); //MailAppではfromが設定できないとのこと
}
}
function lookforemail(searchValue) {
var sheetUrl = "https://docs.google.com/spreadsheets/d/1KSZHs54WrLoaeB4dE0ByeQ5Kyx489OEkiIYeUjlwPTg/edit?usp=sharing";
var ss = SpreadsheetApp.openByUrl(sheetUrl);
// Get the sheet by name
var sheetName = "memberlist";
var sheet = ss.getSheetByName(sheetName);
// Check if the sheet exists
if (!sheet) {
Logger.log("Sheet not found: " + sheetName);
return null;
}
// Get the data range (assuming data is in columns A to C)
var dataRange = sheet.getRange("A:C");
var data = dataRange.getValues();
// Search for the value in column A
for (var i = 0; i < data.length; i++) {
if (data[i][0] == searchValue) {
var correspondingValue = data[i][2];
Logger.log(correspondingValue);
return correspondingValue;
}
}
// Return null if the value is not found
return null;
}