LoginSignup
0
1

More than 1 year has passed since last update.

GASでspread sheetからデータを取得して月末にメール送信するマクロ in 1 hour

Posted at

概要

同居人と生活費を割り勘しているので、共有の家計簿をGoogle spreadsheetで作ってるのですが、月末に自動でサマリーを自分と同居人へメール送信できるようにしたくなりました。

手入力ではなくてgoogle formに入力すると自動でspreadsheetに入る仕組みにしています。
(それに関しては以下の記事のようなことをしています。わかりやすいのでリンク貼らせてもらう)
GoogleフォームとGoogleスプレッドシートを使って家計簿をつける話

そういうわけで、実際の家計簿spreadsheetを開くことはあんまりありません。
ただ、そうすると月末の家計簿見直しとか忘れそうだなーと思ったのと、リマインダーついでにトータルコスト教えてくれたら「うっ!」ってなって家計簿見直す気持ちになるかなーと思ってめっちゃ簡単なマクロを作りました。

面倒だったところ

  • GASのタイマーが月末指定がなかったので、毎日起動にして月末チェックを入れたこと
  • スプレッドシートの操作を思い出すこと・・・(元ExcelVBAerなので慣れている方だけど)

良かったところ

  • 環境構築いらない。tools->script editor開くだけ
  • スクリプト実行のキックが色々だし設定楽ちん
  • ほぼJavaScript

作成手順

1.Google spreadsheetをからscript editorを開く
Screen Shot 2020-06-27 at 15.52.00.png

2.Scriptを作成する
以下の実際のScriptからぺたり。JSなのでとっつきやすくて安心。
フロッピーディスクっぽいボタンからSaveします(フロッピーはもう絶滅したのかな)
色々ハードコーディングなのでメールアドレスとかspreadsheetのファイル名とかソースコードのコメント参考によしなに変更してください。
Screen Shot 2020-06-27 at 15.51.13.png

3.Triggerを設定する
タイマーのようなボタンからこの画面に飛べるので、[Add trigger]をクリックします。
Screen Shot 2020-06-27 at 15.50.19.png

毎晩実行したいので(ホントは月末の夜起動したかったけど、月末という設定ができなかった。毎月だと月末が28日・30日・31日のパターンに対応できない)以下のような感じで設定
Screen Shot 2020-06-27 at 15.49.38.png

4.以上
Scriptを手動実行で挙動を確認したいところですが、月末判定によって月末以外は動かしても何も起こりません。

実際のScript


function sendEmails() {

  //Check if today is the last day of this month.
  const today = new Date();
  const lastDayOfMonth = new Date(today.getFullYear(), today.getMonth() + 1, 0);
  if(today.getDate() !== lastDayOfMonth.getDate()) return; 

  console.log(lastDayOfMonth.getDate()+"is the last day of this month!");

  //ここを自分のメールアドレスにします
  const emailAddressMiki = 'sample_email@sample.com' 
  //家計簿スプレッドシートは2020/6のようなシート名を持っているので、今月のシート名を生成しておきます
  const currentYearMonthSheet = Utilities.formatDate(today,'JST', 'yyyy/M'); 


  //Look for a google spread sheet file I want to use
  //ここではGoogleスプレッドシートのスター付きファイル(条件:starred = true)に
  //限定して探しています
  //自分の環境に合わせて条件変えてみてください
  const files = DriveApp.searchFiles(
    'starred = true and mimeType = "' + MimeType.GOOGLE_SHEETS + '"'); 
  //each file
  while (files.hasNext()) {
    const spreadsheet = SpreadsheetApp.open(files.next());
    const sheets = spreadsheet.getSheets();

    //Check file name
    //私はExpenseというスプレッドシート名ですが
    //適宜自分の取得したいファイル名に変えてください
    if(spreadsheet.getName() !== "家計簿") continue;
    //each sheet
    for(let i = 0 ;i < sheets.length; i++){
      // 今月のシート名かチェックします
      if(currentYearMonthSheet === sheets[i].getName()){
        //私の場合はC9カラムが送信したい値なのでそこを取得。
        const totalAmount = Math.floor(sheets[i].getRange("C9").getValues()[0]);
        const subject = 'Monthly expense report ('+Utilities.formatDate(today, 'JST', 'yyyy, MMM')+")";
        const headerMessage = "Hi! I'll send you " + subject + "\nTotal amount is ¥"+totalAmount+"\n\n";
        MailApp.sendEmail(emailAddressMiki, subject, headerMessage);
      }
    }
  }
}

もうちょっとやりたいこと

  • サマリーメールと言いつつ月の支出の合計出してるだけなので、もうちょっと凝ったサマリーにしたい

  • ハードコード部分を外だしして汎用的なメソッドにしたい

0
1
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
1