お仕事

【GAS】Gmailで請求書送付用メールの下書きを一括作成してみた

個人事業主のみなさんこんにちは。まなてぃです。

個人事業主の毎月の定期業務…
お取引先様への請求書送付!

最近では、会計ソフトで自動で請求書を作成してくれるような便利なサービスも増えましたが、

お取引先さまご指定の請求書をメールで送付する必要がある!

という方も少なくないと思います。

メールの雛形のテキストテンプレートを用意していたとしても、
相手先のメールアドレスを入力したり、お取引先のご担当者様の部署名やお名前を毎月手動で入力するのは、意外と時間がかかりますし、ミスも増えますよね

そこで、プログラミング学習を始めた私がGoogle Apps Script(以下:GAS)を使って、毎月の請求書を送付するためのメール下書きを自動作成するソースコードをシェアします。

謝辞

本プログラムの内容は以下の記事を参考にさせていただきました!
誠にありがとうございます。
GASの基本使い方や作成手順は、ぜひ以下の記事よりご確認ください。

ディップ株式会社 @mi_na_to_8 さま
https://dippeople.dip-net.jp/8573/

GASでメール下書き作成の自動化完成例(動作イメージ)

Googleスプレッドシートの内容

まずはメールの定型文と、メールを作成したいリストをGoogleスプレッドシートに準備します。

シート名は【下書き作成ツール】とします。

Googleスプレッドシートの作成イメージ

参考にさせていただいた記事と同じく
C2セルにはメールの件名、
C3セルにはメール本文のフォーマットを記入することとしました。

また6行目から下の行については、以下のように設定しました。

A列 月(請求書をお送りするときの月を指定)
B列 宛先の会社名を指定
C列 宛先の部署名を指定
D列 宛先のご担当者のお名前を指定
E列 宛先のメールアドレスを指定
F列 ご請求先ごとにお支払い期限日を指定

この時、C2セルとC3セルで6行目以降のリストの文言を流し込みたい箇所には、図のように{月}、{部署名}、{お名前}、{date}などの置換用キーワードを挿入してください。
{}内のキーワードはGASを編集すれば自由に設定できます。

※図では解りやすいように文字色を赤色にしました。色は変更しなくても問題はありません。

メールの内容もコピペしたい方は以下からどうぞ。

メールタイトル 【ご請求書送付】{月}月分ご請求書について
メール本文 {会社名}
{部署名} {お名前}

いつもお世話になっております。
★自分の名前★です。

{月}月分のご請求書をPDFファイルにて送付いたしますので、
ご査収のほどよろしくお願いいたします。

ご不明点や添付ファイルの内容が見られないなど
ございましたらご連絡くださいませ。

※本請求の期日が{date}までとなっております。
期限内にご質問、お振込の手続き等お済ませいただければと思います。

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

【GAS】ソースコードの内容を編集する

詳細なやり方と注意点は、@mi_na_to_8 さまの以下の記事をご覧いただければと思います!
https://dippeople.dip-net.jp/8573/

本ブログでは、上記記事とは異なる箇所と、私がアレンジしたソースコードを公開します。

①GASの編集画面の開き方の仕様に変更有り
Googleスプレッドシートのメニュータブから
「拡張機能」→「Apps Script」をクリックしてGASのエディタを開きます。

②以下のコードを入力
エディタに以下のコードをコピペしてください。

//メニューバーに「下書き一括作成」を追加するコード
function onOpen() {
  const spreadsheet = SpreadsheetApp.getActive();
  const menuItems = [{name: '実行', functionName: 'createEmailDraft'}];
  spreadsheet.addMenu('下書き一括作成', menuItems);
}

//下書きを一括作成するコード
function createEmailDraft(){
  const spreadsheet = SpreadsheetApp.getActive();

  //シート「下書き作成ツール」をアクティブにしてリストを取得
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName("下書き作成ツール"));
  const sheet = SpreadsheetApp.getActiveSheet();

  //CC用のメールアドレスを設定
  //複数設定したい場合はカンマ区切りで指定してください
  const CC = "xxxxxxxxxxxxxxxx@example.com";


  //6行目から最終行までループ処理
  const lastRow = sheet.getLastRow();
  for (let i = 6; i<= lastRow; i++){

    //行ごとに1列目の「月」を取得
    const month = sheet.getRange(i,1).getValue();

    //行ごとに2列目の「会社名」を取得
    const companyName = sheet.getRange(i,2).getValue();

    //行ごとに3列目の「部署名」を取得
    const department = sheet.getRange(i,3).getValue();

    //行ごとに4列目の「お名前」を取得
    const name = sheet.getRange(i,4).getValue();

    //行ごとに5列目の「メールアドレス」を取得
    const to = sheet.getRange(i,5).getValue();

    //行ごとに6列目の「date」を取得
    const date = sheet.getRange(i,6).getValue();


    //行ごとにC2セルの内容を取得して{月}をmonthに変換
    const subject = sheet.getRange(2,3).getValue()
    .replace('{月}',month);

    //「請求書締め切り日」の日付を日本時間へ変換
    let jpdate = Utilities.formatDate( date, 'JST','yyyy年MM月dd日');
    //行ごとにC3セルの内容を取得して{月}をmonthなどに変換
    const message = sheet.getRange(3,3).getValue()
    .replace('{月}',month)
    .replace('{会社名}',companyName)
    .replace('{部署名}',department)
    .replace('{お名前}',name)
    .replace('{date}', jpdate);
    

    console.log(jpdate);

    //取得した内容をGmailで下書き作成
    GmailApp.createDraft(to, subject, message, {cc: CC});

  }
Browser.msgBox("実行完了!\\nメールボックスの「下書き」を確認してください。\\nPDF添付も忘れずに!");

}

 

③ご請求書を送る際に、CCが必要なメールアドレスになるよう、コードを修正します。
以下の箇所を探して、自分のメールアドレスなどを設定してみてください~。

//CC用のメールアドレスを設定
//複数設定したい場合はカンマ区切りで指定してください
 const CC = "xxxxxxxxxxxxxxxx@example.com";

上記のコードの修正が完了したら、任意の名前でGASのプロジェクトを【保存(Ctrl+S)】してください。

プログラムの動作を確認する

Googleスプレッドシートを再読み込みすると、メニュータブに「下書き一括作成」が表示されます。

「下書き一括作成」>「実行」をクリックして、GASを実行します。
初回のみGmailとの連携を求められますので、承認してください。

実行完了すると、メッセージボックスが表示されるので【OK】をクリックします。

メッセージボックスのイメージ

Gmailの下書きボックスを開き、リストの件数分のメールの下書きができていることを確認します。
メールの件名と本文の特定のキーワードが置換され、宛先やCCのアドレスもリストの内容に沿ってそれぞれ入力されていると思います。

あとはお送りするご請求書のPDFファイルなどを、メールに添付することに集中すればOKです!

本プログラムの注意点

お手本とした記事より引用させていただきます。

21行目の「lastRow」で最終行を取得し、6行目から最終行まで繰り返し処理を行っています。しかし、例えば106行目に半角スペース一文字でも入っていると、その行を最終行と認識して、100件分の空白メールが作成されてしまいます。

半角スペースなどが入らない前提のコードとなっておりますので、もしそのような状況が発生する懸念がある場合には、実行前に余分な行を削除するフローを加えたり、21行目の「lastRow」を以下のコードに変更して特定の列の最終行のみを取得するなど、適宜変更して予防してください。

https://dippeople.dip-net.jp/8573/ より

私が作成したプログラムにおいても、上記を回避する例外処理までは書けていません…
(引き続き学びます)

もし空白文字などが誤って入力されてしまう可能性がある場合は、6行目以降で必要ない行は手動で削除してしまうという案も有りかと思います。

みなさんも身近にプログラミングを取り入れて、業務効率化しませんか?

以上です~
ご覧いただきありがとうございました!!

ABOUT ME
まなてぃ
訪問いただきありがとうございます。 まなてぃと申します。 動画編集者をしております。 ブログ+Webデザインもゆるくやっています。 このブログでは私の好きな、消しゴムはんこと生活に関すること、動画のことについて、ざっくばらんに発信できればいいなと思っています。よろしければご覧ください。