質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

2回答

1798閲覧

【超初心者】GASを使ったメール通知

cori

総合スコア3

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

1クリップ

投稿2021/10/06 06:35

編集2021/10/07 02:27

前提・実現したいこと

GASを使って期限が近いタスクをメール通知したいです。
プログラミングの知識がなく、GASについてインターネットで検索しながら入力しましたが
実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

下記「該当のソースコード」欄にある、 var strLimit_format = Utilities.formatDate(strLimit, "JST", "yyyy/MM/dd"); //資格期限 でエラーが表示されます。 エラー内容・・・ Exception: The parameters (String,String,String) don't match the method signature for Utilities.formatDate. mailSend @ コード.gs:25

該当のソースコード

function mailSend() {     var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();                    //スプレッドシートを取得     var sheet1 = spreadsheet.getSheets()[0];                                    //1枚目のシートを取得     var today = new Date();                                                     //今日の日付取得     var today_format = Utilities.formatDate(today, "JST", "yyyy/MM/dd");      //今日の日付整形     /* 静的パラメータ */     var strFrom = "●●●@●●●jp";     var strCc = "●●●@●●●jp";     for (var i = 2; i <= 300; i++) {         /* 動的パラメータ */         var strName = sheet1.getRange(i, 1).getValue();                         //名前         /* 名前が空の場合は戻る */         if ( strName == "" ) {             continue;         }         var strTo = sheet1.getRange(i, 1).getValue();                           //名         var strQualNo = sheet1.getRange(i, 2).getValue();                       //有効期限         var strQualName = sheet1.getRange(i, 3).getValue();                     //業種         var strLimit = sheet1.getRange(i, 11).getValue();                        //資格期限         var strLimit_format = Utilities.formatDate(strLimit, "JST", "yyyy/MM/dd");  //資格期限         var strSub = "[通知]" + strQualName + "【重要】資格期限が迫っています!";                               //Subject         var strBody = strName + "各位\n\nお疲れ様でございます。\n" +                       "●●です。\n\n" +                       "資格期限が迫っています。\n\n" +                       "正確な資格期限は\n" +                       "各自ご確認ください。\n\n" +                       "以上、よろしくお願いします。";          var strLimit_7Date = new Date(strLimit.getYear(), strLimit.getMonth(), strLimit.getDate() - 7); //期限の7日前         var strLimit_7Date_format = Utilities.formatDate(strLimit_7Date,"JST","yyyy/MM/dd");            //期限の7日前整形         var strLimit_30Date = new Date(strLimit.getYear(), strLimit.getMonth(), strLimit.getDate() - 30); //期限の30日前         var strLimit_30Date_format = Utilities.formatDate(strLimit_30Date,"JST","yyyy/MM/dd");            //期限の30日前整形         /* 今日の日付が期限の7/30日前だった場合、メールを送信 */         if ( today_format == strLimit_7Date_format || today_format == strLimit_30Date_format ) {             var send = GmailApp.sendEmail(                 strTo,                 strSub,                 strBody, {                     from: strFrom                 }             );         }     } }

試したこと

インターネット・Q&Aで検索 検索結果がヒットしても正解がわかりません。 ご迷惑をおかけしまして申し訳ございません。ご教授いただければ幸いです。

補足情報(FW/ツールのバージョンなど)

イメージ説明

イメージ説明

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2021/10/06 15:14

シートのキャプチャをつけてください
cori

2021/10/07 00:20

ありがとうございます。 補足情報にキャプチャを追加いたしました。
guest

回答2

0

javascript

1const main = () => { 2 const spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 3 spreadsheet.getSheets()[0].getDataRange().getValues().slice(1).forEach(mailSend); 4} 5const mailSend = (row) => { 6 const sender = "from@example.com"; 7 const cc = "cc@example.com"; 8 const mailAddress = row[0]; //A //名前とメールアドレスが同じなのおかしい。各位ってなってるのもなんか変。 9 // const validateUntil = row[2]; //C これ使わないの奇妙 10 const sector = row[3]; //D 11 const limit = row[10]; //K 12 if(mailAddress === "") return; 13 // if(validateUntil === "") return; 14 if(sector === "") return; 15 if(limit === "") return; 16 try { 17 limit.getFullYear(); 18 } 19 catch { 20 return; 21 } 22 const nextWeekDay = nextWeekDayOf(new Date()); 23 if(nextWeekDay === undefined) return; 24 if(isInNdays(nextWeekDay,7, limit) || isInNdays(nextWeekDay, 30, limit)) { 25 console.log("!!"); 26 //GmailApp.sendEmail(mailAddress, buildSubject(sector), buildBody(mailAddress), { from: sender, cc:cc } ); 27 } 28 console.log(buildSubject(sector), buildBody(mailAddress)); 29} 30const buildSubject = (sector) => `[通知] ${sector}【重要】資格期限が迫っています!`; 31const buildBody = (mailAddress) => `${mailAddress}"さま 32 33お疲れ様でございます。 34●●です。 35 36資格期限が迫っています。 37 38正確な資格期限は 39各自ご確認ください。 40 41以上、よろしくお願いします。`; 42const nextWeekDayOf = (standard) => { 43 const holiday = CalendarApp.getCalendarById("ja.japanese#holiday@group.v.calendar.google.com"); 44 for(let i = 1; i < 30; i++) { 45 const candidate = new Date(standard.getFullYear(),standard.getMonth(),standard.getDate() + i); 46 if(candidate.getDay() === 0 || candidate.getDay() === 6) continue; 47 if(holiday.getEventsForDay(candidate).length < 1) return candidate; 48 } 49 return undefined; 50} 51const isInNdays = (standard, n = 7, target) => { 52 const expected = Utilities.formatDate(new Date(standard.getFullYear(),standard.getMonth(),standard.getDate() + n), "JST", "yyyy/MM/dd"); 53 return expected === Utilities.formatDate(target, "JST", "yyyy/MM/dd"); 54}
名前ファイル有効期限業種hp受付期間申請書格納申請状況担当申請日資格期限
a12021/12/31物品1月末1/1-9/1申請済A5/12a
b12021/12/31物品1月末1/1-9/1申請済A5/122021/10/18
c12021/12/31物品1月末1/1-9/1申請済A5/122021/10/19
d12021/12/31物品1月末1/1-9/1申請済A5/122021/11/10

投稿2021/10/08 16:45

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2021/10/08 16:46

strLimit.getYear() を strLimit.getFullYear() にすれば動きそう
cori

2021/11/05 02:00 編集

下記、【ここにメールアドレス入力】のところだけ入力してみましたが うまくメールが届きませんでした。(実行する関数をmain又はmaiSendで実行) 勉強不足のため1から勉強したいと思います。 ありがとうございました。 const main = () => { const spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); spreadsheet.getSheets()[0].getDataRange().getValues().slice(1).forEach(mailSend); } const mailSend = (row) => { const sender = "【ここにメールアドレス入力】"; const cc = "【ここにメールアドレス入力】"; const mailAddress = row[0]; //A //名前とメールアドレスが同じなのおかしい。各位ってなってるのもなんか変。 // const validateUntil = row[2]; //C これ使わないの奇妙 const sector = row[3]; //D const limit = row[10]; //K if(mailAddress === "【ここにメールアドレス入力】") return; // if(validateUntil === "") return; if(sector === "【ここにメールアドレス入力】") return; if(limit === "【ここにメールアドレス入力】") return; try { limit.getFullYear(); } catch { return; } const nextWeekDay = nextWeekDayOf(new Date()); if(nextWeekDay === undefined) return; if(isInNdays(nextWeekDay,7, limit) || isInNdays(nextWeekDay, 30, limit)) { console.log("!!"); //GmailApp.sendEmail(mailAddress, buildSubject(sector), buildBody(mailAddress), { from: sender, cc:cc } ); } console.log(buildSubject(sector), buildBody(mailAddress)); } const buildSubject = (sector) => `[通知] ${sector}【重要】入札資格の期限が迫っています!`; const buildBody = (mailAddress) => `${mailAddress}"さま お疲れ様でございます。 ●●です。 資格期限が迫っています。 正確な資格期限は 各自ご確認ください。 以上、よろしくお願いします。`; const nextWeekDayOf = (standard) => { const holiday = CalendarApp.getCalendarById("ja.japanese#holiday@group.v.calendar.google.com"); for(let i = 1; i < 30; i++) { const candidate = new Date(standard.getFullYear(),standard.getMonth(),standard.getDate() + i); if(candidate.getDay() === 0 || candidate.getDay() === 6) continue; if(holiday.getEventsForDay(candidate).length < 1) return candidate; } return undefined; } const isInNdays = (standard, n = 7, target) => { const expected = Utilities.formatDate(new Date(standard.getFullYear(),standard.getMonth(),standard.getDate() + n), "JST", "yyyy/MM/dd"); return expected === Utilities.formatDate(target, "JST", "yyyy/MM/dd"); }
papinianus

2021/11/05 11:28

senderとcc以外はそこに値がなければ中断するという処理なのでそのような記入をすれば何も起こらなくて当然です。 コードを理解しないことを責める気は全く無いですが、であれば伏せ字をやめて送信者はこれ、ccはこれと編集しなくていい実際のメールアドレスを記載してください。
cori

2021/11/16 08:46

個人情報になるのでメールアドレスは下記内容でお許しください。 ----------------------------- const main = () => { const spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); spreadsheet.getSheets()[0].getDataRange().getValues().slice(1).forEach(mailSend); } const mailSend = (row) => { const sender = "sampleA@gmail.com"; const cc = "sampleB@gmail.com"; const mailAddress = row[1]; //A //名前とメールアドレスが同じなのおかしい。各位ってなってるのもなんか変。 // const validateUntil = row[2]; //C これ使わないの奇妙 const sector = row[3]; //D const limit = row[10]; //K if(mailAddress === "sampleA@gmail.com") return; // if(validateUntil === "") return; if(sector === "sampleA@gmail.com") return; if(limit === "sampleA@gmail.com") return; try { limit.getFullYear(); } catch { return; } const nextWeekDay = nextWeekDayOf(new Date()); if(nextWeekDay === undefined) return; if(isInNdays(nextWeekDay,7, limit) || isInNdays(nextWeekDay, 30, limit)) { console.log("!!"); //GmailApp.sendEmail(mailAddress, buildSubject(sector), buildBody(mailAddress), { from: sender, cc:cc } ); } console.log(buildSubject(sector), buildBody(mailAddress)); } const buildSubject = (sector) => `[自動通知] ${sector}【重要】入札資格の期限が迫っています!`; const buildBody = (mailAddress) => `${mailAddress}"さま お疲れ様でございます。 ●●です。 資格期限が迫っています。 正確な資格期限は 各自ご確認ください。 以上、よろしくお願いします。`; const nextWeekDayOf = (standard) => { const holiday = CalendarApp.getCalendarById("ja.japanese#holiday@group.v.calendar.google.com"); for(let i = 1; i < 30; i++) { const candidate = new Date(standard.getFullYear(),standard.getMonth(),standard.getDate() + i); if(candidate.getDay() === 0 || candidate.getDay() === 6) continue; if(holiday.getEventsForDay(candidate).length < 1) return candidate; } return undefined; } const isInNdays = (standard, n = 7, target) => { const expected = Utilities.formatDate(new Date(standard.getFullYear(),standard.getMonth(),standard.getDate() + n), "JST", "yyyy/MM/dd"); return expected === Utilities.formatDate(target, "JST", "yyyy/MM/dd"); } ----------------------------- 関数:main スプレッドシートはpapinianus様の一覧をコピー後、資格期限のみ下記に変更しております。 2021/11/23 2021/11/24 2021/11/25 2021/11/26 2021/11/27 2021/11/28 2021/11/29 2021/11/30 2021/12/01 2021/12/02 2021/12/03 2021/12/04 2021/12/05 2021/12/06 2021/12/07 2021/12/08 2021/12/09 2021/12/10 2021/12/11 2021/12/12 2021/12/13 2021/12/14 2021/12/15 2021/12/16
guest

0

ベストアンサー

GAS

1var strLimit = sheet1.getRange(i, 11).getValue(); //資格期限 2var strLimit_format = Utilities.formatDate(strLimit, "JST", "yyyy/MM/dd"); //資格期限

getValue()したセルの値が日付になっていないのでformatDateでエラーになっていると考えられます。確認してください。

投稿2021/10/06 09:03

itagagaki

総合スコア8402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

macaron_xxx

2021/10/07 00:22

補足です。 おそらく、資格期限が空の行でエラーが起きていると思われます。
cori

2021/10/07 00:22

@itagagakiさま アドバイスをいただきありがとうございます。 スプレッドシートのK列の日付をyyyy/mm/dd表示に変更いたしました。 ただ、まだ同じエラーが出ます。 *キャプチャを質問内容の補足に追記いたしました。
cori

2021/10/07 00:50

@macaron_xxx さま アドバイスをいただきありがとうございます。 スプレッドシート資格期限の行に全てyyyy/mm/ddを追加したらエラーがなくなりました! ただ資格期限の行に"2021/11/07""2021/11/06"など30日後あたりを入れましたが メールの通知がきません。まだ別の原因がありそうです・・。一度探してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問