LoginSignup
0
0

More than 1 year has passed since last update.

【GAS】定期的にメール送信させたい

Posted at

ヤクルト1000を飲み忘れることが多いので、毎晩23:00にメールを飛ばすようにした。

目次

1. 概要
2. 構成
3. スクリプト
4. 感想

1. 構成

・次回メール送信時刻
・更新頻度
・メール宛先、タイトル、メール本文

を定義する列をそれぞれ作成

001.PNG

2. スクリプト

時刻の扱いは一度UNIXTIMEに変換すると計算が容易になります。
すぐ変換できるように共通関数として用意。

メール送信のところの動きとしては、

・次回実行時刻が過去時刻であれば実行対象
・次回実行時刻の再計算結果とメールの内容を変数に定義
・メール送信
・次回実行時刻更新

といった具合。

メール送信だけではなく、LINE通知とかにも転用可能。

taskscheduler.js
//━━━━━━━━━━━━━━━
// シート定義
//━━━━━━━━━━━━━━━
var appSs = SpreadsheetApp.openById('スプレッドシートID');

//━━━━━━━━━━━━━━━
// 共通関数
//━━━━━━━━━━━━━━━
function getLastrow(sh, col) {
  return sh.getRange(sh.getMaxRows(), col).
    getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
}

function convUnixtime(jsttime) {
  var unixtime = Date.parse(jsttime)/1000;
  var unixtime_str = unixtime.toFixed();
  var unixtime_int = parseInt(unixtime_str);

  var year = jsttime.getFullYear();
  if (year === 1899) {
    return unixtime_int + 2209194000;
  } else {
    return unixtime_int;
  }
}

function convJsttime(unixtime) {
  return Utilities.formatDate(new Date( unixtime * 1000 ), "JST", "yyyy/MM/dd HH:mm:ss");
}


//━━━━━━━━━━━━━━━
// メール送信 
//━━━━━━━━━━━━━━━
function sendMailByCron() {
  var sh = appSs.getSheetByName('sendMail');
  var lastrow = getLastrow(sh, 1);
  var now = new Date();

  for (var i = 2; i <= lastrow; i++) {
    var exeTime = sh.getRange(i, 1).getValue();
    if (exeTime <= now) {
      var freqCount = sh.getRange(i, 2).getValue();
      var freqCount = Math.trunc(freqCount)
      var freqDuration = sh.getRange(i, 3).getValue();
      var nextExeTime = getNextExeTime(exeTime, freqCount, freqDuration);

      var to = sh.getRange(i, 4).getValue();
      var title = sh.getRange(i, 5).getValue();
      var description = sh.getRange(i, 6).getValue();
      
      MailApp.sendEmail(to, title, description);
      sh.getRange(i, 1).setValue(nextExeTime);
    }
  }
}

//━━━━━━━━━━━━━━━
// 次回実行時刻算出
//━━━━━━━━━━━━━━━
function getNextExeTime(exeTime, freqCount, freqDuration) {
  var before = new Date(exeTime);
  switch(freqDuration) {
    case 'year':
      var after = before.setFullYear(before.getFullYear() + freqCount);
      break
    case 'month':
      var after = before.setMonth(before.getMonth() + freqCount);
      break
    case 'week':
      var after = before.setDate(before.getDate() + freqCount * 7)         
      break
    case 'day':
      var after = before.setDate(before.getDate() + freqCount);
      break
    case 'hour':
      var after = convUnixtime(before) + freqCount * 3600;
      var after = convJsttime(after)
      break
    case 'minute':
      var after = convUnixtime(before) + freqCount * 60;
      var after = convJsttime(after)
      break
  }
  var after = new Date(after);
  var after = Utilities.formatDate(after, 'JST', 'yyyy-MM-dd HH:mm');
  return after
}

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