始業・終業時に決まりきったメールをGmailとGoogle Apps Script(GAS)で毎日自動的に送る方法

Google Apps Script

突然の在宅勤務!始業・終業の通知メールをGmailで自動化してみた

コロナウィルス問題でいきなりテレワークになった方も大勢いらっしゃると思います。

勤怠管理のために始業・終業時にメールを送ってこいという古風な会社・組織もあると思います。

多分、急遽、在宅勤務を開始した公的機関にこの無駄なルールを作っているところが多いと思いますが。。。。

とはいってもルールに逆らっていいことはないので、作業を自動化してしまいましょう。

 

Gmailとそれを自動的に操作するGoogle Apps Script(GAS)というモノを使ってサックとプログラミングします。

プログラミングといってもコピペでいけちゃいますのでご安心ください!!

Google Apps Script(GAS)とは何か?簡単解説!

GmailやGoogleカレンダーなどはほとんどの人が使ってみたことがあると思います。

加えて、Googleスプレッドシート、Googleドキュメントなど、Googleは非常に便利なサービスをたくさん運営しています。

これらのGoogleのサービスをGoogle Apps Scriptを使えば定期実行したり自動化したり、複雑な作業をしたりすることができるようになります。

  • 定期実行
  • 自動化
  • 複雑な作業

Google Apps Script(GAS)はどうやったら使える?

⇩Google Apps Scriptにアクセスします。

https://script.google.com/home

グーグルアカウントを持っていて、ログインしていれば、Google Apps ScriptというWebアプリケーションのページに入ることができます。

新しいプロジェクトをクリックします。

そうするとスクリプトを作成するページに飛びます。

プロジェクト名を「始業自動メール」とかに変更します。

コード.gsのところに関数を記述していくことになります。

このコードのところに後で紹介するスクリプトをコピペすることで、定期自動メール送信は行えるようになりますので、プログラミングしなきゃいけないの?という方は安心してください。

実際にGASを使って定期的にGメールを送信する!

プログラムは以下です。ほとんどコピペで自動メール送信を行えるようになります。

この例では、始業メールを'office-staff@konyagayamada.co.jp'に送ります。

送信先のメールアドレス (to)

メールのタイトル (title)

メールの本文 (body)

を用意してください。

function mail() {
  var today = new Date();
  var array = ['日','月','火','水','木', '金', '土'] 
  var to = 'office-staff@konyagayamada.co.jp';
  var title = (today.getMonth()+1) + "月" + today.getDate() + "日" + "("+ array[today.getDay()] + "曜日)" + " 8:30から始業します。";
  var body = "本日はテレワークを行います。\n"+(today.getMonth()+1) + "月" + today.getDate() + "日" + "("+ array[today.getDay()] + "曜日)" + " 8:30から始業します。\nよろしくお願いします。\n\nアプリンゴ\n";
  var aliases = GmailApp.getAliases();
  GmailApp.sendEmail(to, title, body, {'from': aliases[0], 'name': 'Tadano Hito','cc': 'syomu@konyagayamada.co.jp','bcc': 'myself@gmail.com'});
}
function isBusinessDay(date){
  
  if (date.getDay() == 0 || date.getDay() == 6) {
    return false;
  }
  const calJa = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com');
  if(calJa.getEventsForDay(date).length > 0){
    return false;
  }
  return true;
}

function setTrigger(){
  delTrigger();
  var setTime = new Date();
  setTime.setHours(8);
  setTime.setMinutes(30);
  if (isBusinessDay(setTime)){
    ScriptApp.newTrigger('mail').timeBased().at(setTime).create();
  }
}

function delTrigger() {
    var triggers = ScriptApp.getProjectTriggers();
    for(var i=0; i < triggers.length; i++) {
        if (triggers[i].getHandlerFunction() == "mail") {
            ScriptApp.deleteTrigger(triggers[i]);
        }
    }
}

コード.gsの部分に上記のスクリプトを貼り付けます。

スクリプトを丁寧に解説

このスクリプトにはfunction ~で始まる関数が4つあります。

mail(),

isBusinessDay(date),

setTrigger(),

delTrigger()

です。

mail()

実際に送信先にメールを送信する関数。

to は送信先のメールアドレス

title はメールのタイトル

body はメールの内容

文面に改行を入れたい場合は改行コード"\n"を文中に入れます。

実情に合わせて、書き換えてください。

'from'・・・ Gmailに別のメールアドレスを設定している場合(エイリアス)、そのエイリアスのアドレスを使用することができます。

エイリアスのメールアドレスについて

'name'・・・送信元の名前を設定できます。

'cc'・・・ccで送りたいアドレスはここに設定します。

'bcc' ・・・bccもできます。

↓Apps Scriptのドキュメント

https://developers.google.com/apps-script/reference/gmail/gmail-app

isBusinessDay(date)

日付dateが営業日かどうか判定する関数。営業日であればtrueを返し、土日や祝日であればfalseを返す。

営業日・・・土日や祝日を除いた平日のこと

setTrigger()

Google Apps Scriptでメールを送信したい時刻にトリガーを設定する関数。

このスクリプトだと

setTime.setHours(8);

setTime.setMinutes(30);

のところで、8時30分にメールを送信するように設定されている。

delTrigger()

設定されたトリガーがそのまま残るので、setTriggerの最初で呼び出して、過去のトリガーを削除するための関数。setTrigger関数の最初の行で呼び出されている。

トリガーの仕組みとその設定方法

定期実行を行うためにはトリガーの仕組みと設定方法を理解する必要があります。

トリガーの設定のために上記のアイコンをクリックします。

トリガー設定画面に移りますので、トリガーを追加をクリックします。

設定ができたら保存します。

このようにしてトリガーを設定すると以下のようなことが行われるようになります。

午前4時〜5時の間にsetTrigger()を実行されます。そうすると、自動的にsetTriggerは8時30分にmail()を実行するようにトリガーを設定します(setTrigger関数内のnewTrigger('mail')が新しいトリガーを作ります)。そして8時30分になるとmailが実行されます。

毎日この流れが繰り返され、定時にメールを送信できるようになりました。

もう一つ「終業自動メール」プロジェクトを同じように作成すれば終業時にもメールを送れるようになります。

また、isBusinessDay(setTime)という関数で土日・祝日を除いた平日のみメールが送信されるようになっているので安心です! 

Google Apps Scriptの簡単な使い方

上で紹介しきれなかった補足情報をここで紹介します。

関数を選んで実行

関数を選んで実行できます。

簡単に関数をテストできますね

例えばmail関数を選んで実行を押すと、メールが送信されます(テストする際送信先を自分のメールアドレスなどにしておきましょう。さもないと、不審なメールを相手に送ってしまいます)。

ログを出力したい!

Logger.log()でログを出力することができます。

例えば変数setTimeの中身を確認したい場合、

Logger.log(setTime);

で中身を確認できます。

関数を実行した後で、Macの場合だと、

command + enter

を押すと、ログ出力画面に切り替わります。

Gmailのエイリアスについて

Gmailでのエイリアス(別名)メールアドレスの設定方法を解説します。

これを設定することで、例えば、Gmailから送っているのにあたかも職場のメールアドレスから送信しているように見せかけることができます。

Gmailの設定をクリックします。

アカウントとインポートから他のメールアドレスを追加できます。

'from'にこのアドレスを指定すると、そのメールアドレスから送信されたようにすることができます。

Googleカレンダーの設定について

古くからGoogleカレンダーを利用しているユーザーのかたの場合、日本の祝日を参照するIDである

'ja.japanese#holiday@group.v.calendar.google.com'

が異なることがある様です。

その確認方法について簡単に説明しておきます。

Googleカレンダーには

  • 他の人のカレンダー
  • 祝日(日本の祝日やキリスト教の祝日など)
  • スポーツの日程(日本の野球チームの日程などもある、例えば巨人とか)
  • 月の位相

などを自分のカレンダーに追加できます。

上で紹介した自動始業・終業メールでは"日本の祝日"からデータを利用しています。

自分のGoogleカレンダーを開いて、下の方にあるその他のカレンダーから”日本の祝日”にカーソルを載せます。

設定をクリックします。

カレンダーIDが紹介したIDと同じか確認してみてください。

コメント

  1. こちらの記事にあるコードをコピペしてGASで自動送信の設定をしてみたのですが、うまくいきません
    何が原因でしょうか?
    エラーメッセージは
    2020/08/20 4:54:52 エラー TypeError: Cannot read property ‘getEventsForDay’ of null
    at isBusinessDay(メール自動送信:16:12)
    at setTrigger(メール自動送信:27:7)

    実際に書いたコードは以下のようになります。
    function mail() {
    var today = new Date();
    var array = [‘日’,’月’,’火’,’水’,’木’, ‘金’, ‘土’]
    var to = ‘送り先’;
    var title = “件名”;
    var body = “本文”;
    var aliases = GmailApp.getAliases();
    GmailApp.sendEmail(to, title, body, {‘from’: aliases[0], ‘name’: ‘名前’});
    }
    function isBusinessDay(date){

    if (date.getDay() == 0 || date.getDay() == 6) {
    return false;
    }
    const calJa = CalendarApp.getCalendarById(‘ja.japanese#holiday@group.v.calendar.google.com’);
    if(calJa.getEventsForDay(date).length > 0){
    return false;
    }
    return true;
    }

    function setTrigger(){
    delTrigger();
    var setTime = new Date();
    setTime.setHours(7);
    setTime.setMinutes(30);
    if (isBusinessDay(setTime)){
    ScriptApp.newTrigger(‘mail’).timeBased().at(setTime).create();
    }
    }

    function delTrigger() {
    var triggers = ScriptApp.getProjectTriggers();
    for(var i=0; i < triggers.length; i++) {
    if (triggers[i].getHandlerFunction() == "mail") {
    ScriptApp.deleteTrigger(triggers[i]);
    }
    }
    }

    ご検討宜しくお願い致します。

    • コメントありがとうございます。

      Googleカレンダー側の設定の問題だと思います。

      http://syasuda.com/d/blog/2016/11/googleid.html
      の人と同じような状態かと思います。

      かなり古くからgoogleカレンダーを利用している人が参照している日本の祝日カレンダーは
      ‘ja.japanese#holiday@group.v.calendar.google.com’
      と違うようです。

      googleカレンダーの他のカレンダーの設定から

      カレンダーIDを見てみてください。

      また、一度日本の祝日カレンダーの登録を解除して、再登録すると
      カレンダーIDを
      ‘ja.japanese#holiday@group.v.calendar.google.com’
      に変更することができると思います。

      記事の最後尾に説明を図いりで追記したので参考にしてみてください。