r_s_SK
@r_s_SK (まく まく)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【GAS】今日のデータが未入力の場合、メール通知

「日付」列に本日の日付が無かったらメール通知

毎日1回必ずデータを入力しているのですが、担当者が入力を忘れないように「日付」の列に本日の日付が無かったら、メール通知させようと思ってます。
指定時間、例えば毎日17時に「日付」の列を確認させ、本日の日付が無ければにメールで通知というようなイメージをしています。
また、出来れば土日を除く月〜金曜日のみメール通知をさせたいです。 

色々調べてみたのですが、「無かったら」というものが見つからず困っております。少しでもアドバイスいただけますとありがたいです。

以上よろしくお願い致します。

0

2Answer

以下のような実装でどうでしょう?
①トリガーとして時間主導型で実行する
②スクリプト内で実行日時を取得し、曜日判定を行う
③スプレッドシートの日付列を取得(getRange(), getValues(), flat()を使って配列で取得)
④実行日付の年月日と日付列の年月日が一致するものがあるかどうかを取得(filter()を使って一致する配列のみに絞り込む)
⑤なければメール通知を行う

色々調べてみたのですが、「無かったら」というものが見つからず困っております

→「無かったら」で調べるのではなく、「有ったら」何もしないとすればいいと思います。

すごくざっくりした作りになりますが下記のような作りにすればいいと思います。

function sendNotice() {
  const today = new Date()
  const dayOfWeek = today.getDay();
  if (dayOfWeek === 0 || dayOfWeek === 6) {
    // 0:日曜日 6:土曜日 の場合終了
    return;
  }

  if (hasTodayRow()) {
    // 今日の日付分があれば終了
    return;
  }

  sendMail('example@example.com');
}

function hasTodayRow()
{
  const ss = SpreadsheetApp.openById("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
  const sheet = ss.getActiveSheet(); 
  const lastRow = sheet.getLastRow();

  const range = sheet.getRange(2, 1, lastRow - 1); // 1行目はヘッダ、A列に日付列があると想定、 A2セルから最終行 - 1(ヘッダ分)の範囲を取得
  const values = range.getValues().flat();

  const today = new Date();
  const y = today.getFullYear();
  const m = today.getMonth();
  const d = today.getDate();

  // 年月日が一致するものだけを取得
  // スプレッドシート側の日付の入力が日付型想定(文字列で入力していれば文字列比較の実装にする必要あり)
  const todayArray = values.filter(function(val) {
    if (y !== val.getFullYear()) {
      return false;
    }
    if (m !== val.getMonth()) {
      return false;
    }
    if (d !== val.getDate()) {
      return false;
    }

    return true;
  })

  // 今日の日付の行があればTrueを返す
  return todayArray.length > 0;
}

function sendMail(address) {
  const subject = '~~件名~~';
  const body = `メール本文`;
  GmailApp.sendEmail(address, subject, body);
}

トリガーとして時間主導型、日付ベースのタイマーにして時刻を選択すると良いと思いますが、例えば17時ジャストに動いてくれるわけでは無さそうです。
(ジャストで実行したい場合のやり方もあるようなので、そちらは別途ググってみてください)

image.png

1Like

g-iki様
詳しくご回答いただきありがとうございます!
只今出先なのでまだ試せていませんが、後ほど確認させていただきます。
トリガーの件も承知致しました。
ありがとうございます。

取り急ぎお礼とさせて頂きます。

0Like

Comments

  1. @r_s_SK

    Questioner

    g-iki様
    確認してみましたが無事出来ました!
    有難う御座いました。

    「なかったらメールを送る」ではなく、「なかったら何もしないという」ことなのですね。
    とても勉強になりました。

    ありがとうございました。

Your answer might help someone💌