見出し画像

GAS メール下書きツールができた! スプレッドシートのデータを元にポチっとやってメールを自動作成じゃ~~~~~


できた~~~~~!!!!!
やった~~~~~!!!!!!
実戦で使えるぞ~~~~~~~~!!!!!!


経緯

サンプルコード

もっといい書き方があるのかもしれないけど、ひとまず上手くいったのでとてもうれしい!そして、一行一行の意味がわかるのがうれしい!

let j = 0; で下書き作成の有無をカウントするという発想がなかった。これはMさんに教えてもらった。ありがたい、なるほど~と思った半面、自分で思いつけなくてすごく悔しい。

/**
* スプレッドシートから、メールの下書きを作成する。
*/
function createDraftEmail() {
 const ui = SpreadsheetApp.getUi();
 const response = ui.alert('下書きメールを作成しますか?', ui.ButtonSet.YES_NO);
 let j = 0; //下書き作成の有無カウント用
 if (response == ui.Button.YES) {
   //ui.alert('下書きを作成中です。'); ※この表示は不要なのでコメントアウトした。お好みで。
   /* 値の取得・投稿したい内容をスプシから取得 */
   const sheet = SpreadsheetApp.getActiveSheet();
   const lastRow = sheet.getLastRow();
   /* 作成するかしないかの判定 */
   for (let i = 5; i <= lastRow; i++) {
     if (sheet.getRange(i, 8).getValue() === "下書き作成する") {
       const values = sheet.getRange(i, 1, 1, 10).getValues();
       /* メールに差し込む各項目 */
       let recipientTimestamp = values[0][0]; //i行目の1行目1列のセル情報=タイムスタンプ
       recipientTimestamp = Utilities.formatDate(recipientTimestamp,"JST", "yyyy/MM/dd-HH:mm:ss");//日付の表示形式変換
       const recipient = values[0][1];
       const inquiryType = values[0][2];
       const inquiryDetails = values[0][3];
       const recipientName = values[0][4];
       const recipientAffiliation = values[0][5];
       const recipientTel = values[0][6];
       const replyperson = values[0][8];
       const replyBody = values[0][9];
       const options = {
         // from: "メールアドレスを入れて、冒頭の//を削除してください。この項目を使用しない場合はこのままコメントアウト。",
         // cc: "同上",
         // name: '差出人名です、同上'
       };
       /* メール文面 */
       //↓件名
       const subject = (`${recipientName}様 お問い合わせについて`)
       //↓本文 
       const body = (`${recipientAffiliation}
${recipientName} 様
お世話になっております。${replyperson}です。
この度はお問い合わせをいただき、ありがとうございます。
${replyBody}
----------------------------------------
▼お問い合わせ
----------------------------------------
${recipientAffiliation}
${recipientName} 様
お問い合わせ日時:${recipientTimestamp}
お問い合わせ種類:${inquiryType}
お問い合わせ内容:${inquiryDetails}
----------------------------------------
以上、どうぞよろしくお願いいたします。
----------------------------------------
署名など`)
       /* メール下書き作成 */
       GmailApp.createDraft(recipient, subject, body, options);
       /* 下書き作成後の処理  */
       sheet.getRange(i, 8).setValue("下書き作成済");//下書きが作成できたら、H列は「下書き作成済」とセットする。
       j += 1;
     }
   }
   if (j > 0) {
     ui.alert(`下書きを ${j}件 作成しました。\n\nGmailの下書きにメールが作成されました。\nこのスクリプト終了後に、自分でGmailを開いて確かめてください。\n\nすぐに下書きが反映されないときは、しばしお待ちください(30秒~1分程度)`);
   } else {
     ui.alert(`「下書き作成する」の指定が 0件 のようです。\nメールの下書き作成をキャンセルします。`);
   }
 }
 else {
   ui.alert('下書き作成をキャンセルしました。');
 }
}


解説

スプレッドシートはこんな感じなっている。

画像1

1行目はグダグダと注意や説明を書いている。
5行目以降のデータを取得している。
やっていることは単純で、H列で「下書き作成する」と選択されていれば、その行のデータのメールの下書きを作成する。
青い「メール下書きを作成する」というボタンを押せばスクリプトが実行される。
スプレッドシートのメニューに足すこともできるが、ボタンがあったほうがみんな気づいてくれるのでそうした。


「下書き作成する」を選んで、「メール下書きを作成する」ボタンをポチっとすると、

画像2

このようにメッセージが出る。

画像3

いいえを選ぶとそこで終わる。
はいを選ぶと下書き作成に進み、n件 作成しました とメッセージが出る。

画像4

また、スプレッドシートで「下書き作成する」となっていた箇所が「下書き作成済」に置き換わる。

画像5

メール下書きを確認すると、

画像6

このように下書きが出来ている。
これで、めんどうコピペをしなくて済む&コピペミスもない。やったー!
「下書き作成する」が2件なら2件分メール作ってくれる。

今後の課題

・スプレッドシートの行や列を動かされるとつらい。権限や保護するかなあ。
・日付をYYYY/MM/DD のような形に変換がよくわからない。→解決、コードも差し替え済。追記に書きました。
・配列のうまい書き方がわからない。
・return,continueの使い方がよくわからない。
・手続き型で書くと~とアドバイスいただいたが、それがよくわからない。

謝辞

noteでスキしてくださった方、
focebokでいいねやコメントくださった方、
Twitterでいいねやコメントくださった方、
slackでリアクションやコメントくださった方、
ほんとーーーーーーーーーーーーーーーーーにありがとうございます!!!!

とても励みになっています!!!



追記

日付はこちらの記事を参考に変換できました。
https://auto-worker.com/blog/?p=1114

リファレンスはこれです。

https://developers.google.com/apps-script/reference/utilities/utilities#formatdatedate,-timezone,-format




いただいたサポートで、書籍代や勉強費用にしたり、美味しいもの食べたりします!