【GAS】Gmailで請求書送付用メールの下書きを一括作成・chatGPTに解説してもらった

当ページのリンクにはプロモーションが含まれています。

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

個人事業主の毎月の定期業務にお取引先様への請求書送付作業があります。企業にお勤めの皆様も、1件1件メールでお送りしている会社さんは多いのではないでしょうか?

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

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

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

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

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

2023/03/14追記
最近流行りのchatGPT様にて、エラー処理やコードの解説をしてもらったため記事を更新します。

(スポンサーリンク)

目次

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";

  //最終行を取得
  const lastRow = sheet.getDataRange().getLastRow();

  //6行目から最終行までループ処理
  for (let i = 6; i <= lastRow; i++) {
    try {
      const row = sheet.getRange(i, 1, 1, 6).getValues()[0];
      const month = row[0];
      const companyName = row[1];
      const department = row[2];
      const name = row[3];
      const to = row[4];
      const date = row[5];

      const subject = sheet.getRange(2, 3).getValue().replace('{月}', month);

      //「請求書締め切り日」の日付を日本時間へ変換
      let jpdate;
      try {
        jpdate = Utilities.formatDate(date, 'JST', 'yyyy年MM月dd日');
      } catch (e) {
        console.error(`Error occurred while formatting date. row=${i}, date=${date}`);
        continue;
      }

      const message = sheet.getRange(3, 3).getValue()
        .replace('{月}', month)
        .replace('{会社名}', companyName)
        .replace('{部署名}', department)
        .replace('{お名前}', name)
        .replace('{date}', jpdate);

      GmailApp.createDraft(to, subject, message, { cc: CC });
    } catch (e) {
      console.error(`Error occurred while processing row ${i}: ${e}`);
    }
  }

  //ダイアログボックスを表示して処理が完了したことを通知
  SpreadsheetApp.getUi().alert("実行完了!\nメールボックスの「下書き」を確認してください。\nPDF添付も忘れずに!");
}

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

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

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

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

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

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

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

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

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

あとはお送りするご請求書のPDFファイルなど、メールに添付する資料を忘れないようにすればOKです!

chatGPTさんによるコード解説(読みたい人だけどうぞ)

このコードは、Googleスプレッドシート上で特定の形式のデータを入力した場合に、Gmailの下書きを一括で作成する機能を実装したものです。

具体的には、スプレッドシート上の「下書き作成ツール」というシートに、送信先やタイトル・本文に必要な情報を入力すると、その内容を元にGmailの下書きを一括で作成します。メールアドレスはCCで設定することができ、複数のアドレスを設定することもできます。

以下、コードの詳細な解説です。

function onOpen()

スプレッドシートを開いたときに実行される処理を定義する関数です。この関数では、メニューバーに「下書き一括作成」という項目を追加する処理を行っています。

const spreadsheet = SpreadsheetApp.getActive();

アクティブなスプレッドシートを取得するためのコードです。

const menuItems = [{ name: '実行', functionName: 'createEmailDraft' }];

追加するメニュー項目の名前と、実行される関数を指定しています。この場合は「実行」という名前で、createEmailDraft()という関数を実行するようになっています。

spreadsheet.addMenu('下書き一括作成', menuItems);

addMenu()メソッドを使って、メニューバーに「下書き一括作成」を追加する処理を行っています。

function createEmailDraft()

Gmailの下書きを一括で作成するための関数です。この関数では、下書きを作成するために必要な情報を取得し、ループ処理を行ってGmailの下書きを一括で作成します。

const spreadsheet = SpreadsheetApp.getActive();

アクティブなスプレッドシートを取得するためのコードです。

spreadsheet.setActiveSheet(spreadsheet.getSheetByName("下書き作成ツール"));

「下書き作成ツール」という名前のシートをアクティブにしています。このシートには、Gmailの下書きを作成するために必要な情報が入力されています。

const sheet = SpreadsheetApp.getActiveSheet();

アクティブなシートを取得するためのコードです。

const CC = "xxxxxxxxxxxxxxxx@example.com";

CC用のメールアドレスを指定するためのコードです。複数のメールアドレスを設定する場合は、カンマで区切って複数のメールアドレスを指定することができます。

const lastRow = sheet.getDataRange().getLastRow();

getDataRange()メソッドを使って、シートに入力されているデータの範囲を取得しています。getLastRow()メソッドを使って、データが入力されている最終行の行番号を取得しています。

for (let i = 6; i <= lastRow; i++) {

6行目から最終行までループ処理を行うためのコードです。letを使ってiを宣言しています。ループの終了条件はlastRowとして、最初の行を表す1から5行目はスキップしています。

try { ... } catch (e) { ... }

Gmailの下書きを一括で作成する処理を行うためのコードです。try-catch構文を使って、エラーが発生した場合にはログにエラーを出力し、その行の処理をスキップします。

const row = sheet.getRange(i, 1, 1, 6).getValues()[0];

ループで処理する行のデータを取得しています。getRange()メソッドを使って、行の範囲を取得しています。getValues()メソッドを使って、範囲内のセルの値を二次元配列として取得しています。その後、配列の0番目を取得することで、一次元配列としてデータを取得しています。

const month = row[0]; const companyName = row[1]; ...

取得したデータをそれぞれの変数に格納しています。配列のインデックス番号で、各セルの値を取得しています。

const subject = sheet.getRange(2, 3).getValue().replace('{月}', month);

メールの件名を作成するためのコードです。getRange()メソッドを使って、2行目の3列目のセルの値を取得しています。getValue()メソッドを使って、セルの値を取得しています。replace()メソッドを使って、テンプレート内の「{月}」を、取得したmonthの値に置換しています。

let jpdate; try { jpdate = Utilities.formatDate(date, 'JST', 'yyyy年MM月dd日'); } catch (e) { ... }

メールの本文に挿入する日付を、日本時間に変換するためのコードです。Utilities.formatDate()メソッドを使って、日付を日本時間に変換しています。変換が正常にできなかった場合は、ログにエラーを出力してその行の処理をスキップします。

const message = sheet.getRange(3, 3).getValue() .replace('{月}', month) ...

メールの本文を作成するためのコードです。

getRange()メソッドを使って、3行目の3列目のセルの値を取得しています。getValue()メソッドを使って、セルの値を取得しています。replace()メソッドを使って、テンプレート内の{月}、{会社名}、{部署名}、{お名前}、{date}を、それぞれ取得した値に置換しています。

GmailApp.createDraft(to, subject, message, { cc: CC });

Gmailの下書きを作成するためのコードです。createDraft()メソッドを使って、下書きを作成しています。toには、宛先のメールアドレスを、subjectには件名を、messageには本文を、{cc: CC}でCCのメールアドレスを指定しています。

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

処理が完了したことを通知するためのコードです。ダイアログボックスを表示して、処理が完了したことをユーザーに通知しています。

まとめ

本記事では、GASを使って、毎月の請求書を送付するためのメール下書きを自動作成するソースコードをシェアしました。

みなさんも身近にプログラミングを取り入れて、業務効率化しませんか?
chatGPTも登場し、要件さえ整理できれば簡単に業務効率化を行うことができる場合があります。

プログラミングの基礎を学ぶと、プログラムの基礎や組み立て方がわかるようになります。より具体的なエラー処理の指定なども含めて、chatGPTさんにコードを書いてもらうことができるでしょう。

ここまで、ご覧いただきありがとうございました!

効率的にプログラミング基礎を学ぶなら

(スポンサーリンク)

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

訪問いただきありがとうございます。
まなてぃと申します。
元IT企業の人→フリーランス→派遣OL&主婦。ブログを書いています。最近はデータ集計や分析のお仕事をしています。
このブログでは、主婦(主夫)さんに向けた、ライフスタイルに関すること、自身のスキルアップのことなど、ざっくばらんに発信できればいいなと思っています。よろしければご覧ください。

目次