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

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

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

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

Q&A

2回答

1829閲覧

GASの日付表示を変更したい

ankou

総合スコア15

Google Apps Script

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

0グッド

0クリップ

投稿2018/12/09 15:17

- GASを使ってやりたいこと

■スプレッドシートに記載した表をGメールに貼り付けてHTML形式で送信する

出来ていること

①Gメールの送信
②スプレッドで作成した表のメールへの記載

出来ないこと

日付の形式変更「Tue Dec 11 2018 17:00:00 GMT+0900 (JST)」になる。
→したいこと:「yyyy/mm/dd」の表示にしたい

教えてほしいこと

Utilities.formatDateを利用することはわかっているのですが
スプレッドの1列目に記載している日付の読み取りや形式を変更してのメールへの記載がうまくいきません。
内容確認いただけると幸いです。

function nouki() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getSheetByName("★配信まとめ"); var sheet2= ss.getSheetByName("mail本文"); var dataRange = sheet2.getDataRange(); var dtRange = sheet.getDataRange(); var myValues = dataRange.getValues(); var myValue = dtRange.getValues(); var LR = sheet.getRange(1,3).getValue(); var lastRow = sheet.getLastRow(); var lastColum = sheet.getLastColumn(); var subject = sheet2.getRange(4, 4).getValues(); var body = sheet2.getRange(5, 4).getValues(); var MAIL_ADDRESS_TO = sheet2.getRange(8,4).getValues(); var MAIL_ADDRESS_CC =''; var format = 'YYYY/MM/DD'; if(LR > 0){ //メール本文配列を定義 var item=[] //それぞれのフォントなどhtmlで設定 var style = '<span style="background-color: rgb(0, 0, 255);"><font face="Meiryo UI">'; var style1 = '<font face="Meiryo UI">'; var style2 = '<font face="Meiryo UI"><div>'; var style3 = '<font color="#ff0000" face="Meiryo UI">'; var style4 = " style='border-collapse: collapse;border:1px solid #000000;'"; var style5 ='<font color="white">'; //本文挿入 item.push(style2 + body + "<BR></div></font>") //データを取得し、HTMLのテーブルを作成。 item.push("<table" + style4 + " cellpadding='3'>"); //テーブル内項目、1行目 item.push("<tr" + style4 + ">") for(j=1;j<8;j++){ var values = sheet.getRange(2,j).getValues(); item.push("<td bgcolor=' #FFA07A' nowrap" + style4 + ">"+style1 +values+"</font></td>"); } //テーブルリスト、3行目~ //ここがうまくいかないところ。。 //1列目に日付があるため、その表記を「yyyy/mm/dd」に変更したいがうまく読み取ってくれません for(var i=3;i<lastRow;i++){ var hiduke = sheet.getRange(i,2).getValues(); var uhiduke = Utilities.formatDate(myValue[i][0],"yyyy/MM/dd"); for(var i=3;i<lastRow;i++) item.push("<tr" + style4 + ">") for(j=1;j<8;j++) { var values = sheet.getRange(i, j).getValues(); item.push("<td nowrap" + style4 + ">" + style1+ values+"</font></td>"); } item.push("</tr>") } item.push("</table>"); item.push("<br><br>"); item.push(style2+"以上、ご確認の程、よろしくお願いいたします。</font><br><br><br>"); }   var result = Browser.msgBox("メッセージを送信しますか?" ,Browser.Buttons.YES_NO); if(result=="yes"){ //メール送信 GmailApp.sendEmail(MAIL_ADDRESS_TO, subject, body, {cc:MAIL_ADDRESS_CC,from:'*******@*****', name:'******',htmlBody :item.join("\n")}); } };

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

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

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

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

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

guest

回答2

0

回答そのものはkei344様の最初の回答で終わっています。
が、迷路に入っているみたいなので

第一にインデント(左からのスペースとか)を維持しましょう。

papin(n)と書いたところで手直しをしています。
0. (1)ヘッダを増やしましょう
0. (2)ヘッダ行を閉じましょう
0. (3)ここでループしちゃだめ
0. (4)ここで日付を書きましょう
0. formatのところですが、myvalues[i]だとダメなんじゃないかと思います(rangeは1はじまり、myvaluesは配列なので0はじまり、同じiでは指せないのでi-1としました)
→これが当初コメントで「「TypeError: undefined からプロパティ「0」を読み取れません。」というエラーが表示されてしまいます。」と言っていたところに該当するはず。
→コメントの最後のほうで迷子になっている理由はおそらくmyvalues[2][0]と固定で2を指定してるからです。iから推論しなきゃ、そりゃ全部が同じ日付になります。

javascript

1function nouki() { 2 3 var ss = SpreadsheetApp.getActiveSpreadsheet(); 4 var sheet = ss.getSheetByName("★配信まとめ"); 5 var sheet2 = ss.getSheetByName("mail本文"); 6 var dataRange = sheet2.getDataRange(); 7 var dtRange = sheet.getDataRange(); 8 var myValues = dataRange.getValues(); 9 var myValue = dtRange.getValues(); 10 var LR = sheet.getRange(1, 3).getValue(); 11 var lastRow = sheet.getLastRow(); 12 var lastColum = sheet.getLastColumn(); 13 var subject = sheet2.getRange(4, 4).getValues(); 14 var body = sheet2.getRange(5, 4).getValues(); 15 var MAIL_ADDRESS_TO = sheet2.getRange(8, 4).getValues(); 16 var MAIL_ADDRESS_CC = ''; 17 var format = 'YYYY/MM/DD'; 18 19 if (LR > 0) { 20 21 //メール本文配列を定義 22 var item = [] 23 24 //それぞれのフォントなどhtmlで設定 25 var style = '<span style="background-color: rgb(0, 0, 255);"><font face="Meiryo UI">'; 26 var style1 = '<font face="Meiryo UI">'; 27 var style2 = '<font face="Meiryo UI"><div>'; 28 var style3 = '<font color="#ff0000" face="Meiryo UI">'; 29 var style4 = " style='border-collapse: collapse;border:1px solid #000000;'"; 30 var style5 = '<font color="white">'; 31 32 //本文挿入 33 item.push(style2 + body + "<BR></div></font>") 34 35 //データを取得し、HTMLのテーブルを作成。 36 item.push("<table" + style4 + " cellpadding='3'>"); 37 38 //テーブル内項目、1行目 39 item.push("<tr" + style4 + ">") 40 item.push("<td bgcolor=' #FFA07A' nowrap" + style4 + ">日時</font></td>"); //papin(1) 41 for (j = 1; j < 8; j++) { 42 var values = sheet.getRange(2, j).getValues(); 43 item.push("<td bgcolor=' #FFA07A' nowrap" + style4 + ">" + style1 + values + "</font></td>"); 44 } 45 item.push("</tr>"); //papin(2) 46 47 //テーブルリスト、3行目~ 48 //ここがうまくいかないところ。。 49 //1列目に日付があるため、その表記を「yyyy/mm/dd」に変更したいがうまく読み取ってくれません 50 for (var i = 3; i < lastRow; i++) { 51 var hiduke = sheet.getRange(i, 2).getValues(); 52 var uhiduke = Utilities.formatDate(myValue[i-1][0],'JST','yyyy/MM/dd'); //kei344様指摘 53 // for (var i = 3; i < lastRow; i++) //papin(3) 54 item.push("<tr" + style4 + ">"); 55 item.push("<td nowrap" + style4 + ">" + style1 + uhiduke + "</font></td>"); //papin(4) 56 for (j = 1; j < 8; j++) { 57 var values = sheet.getRange(i, j).getValues(); 58 59 item.push("<td nowrap" + style4 + ">" + style1 + values + "</font></td>"); 60 } 61 item.push("</tr>") 62 } 63 item.push("</table>"); 64 item.push("<br><br>"); 65 item.push(style2 + "以上、ご確認の程、よろしくお願いいたします。</font><br><br><br>"); 66 } 67 var result = Browser.msgBox("メッセージを送信しますか?", Browser.Buttons.YES_NO); 68 if (result == "yes") { 69 70 //メール送信 71 72 GmailApp.sendEmail(MAIL_ADDRESS_TO, 73 subject, 74 body, 75 { 76 cc: MAIL_ADDRESS_CC, from: '*******@*****', 77 name: '******', htmlBody: item.join("\n") 78 }); 79 } 80};

総評としては、

  • 元のコードがよろしくないです(申し訳ないですが、ほとんど読んでないです。もし誰かのコードを参考にしているなら、その人のコードは今後参考にしないほうが幸せになれます)。全ての原因はコードが整理されていないことにあると言って過言でないです
  • 違うエラーの質問を重ねても有意な回答は得られません

日付のエラーのときには、日付を未フォーマットで送れるのかを検証してください。日付が未フォーマットでも思ったとおりになっていない状態で「日付のフォーマットエラー」です、という質問をしたらいくら親切な人の回答があっても、結局望んだ結果は得られません。
どうしても、日付を先に解決したいなら、じゃあそこはできた、次はこういう問題が起きた、ということで次の質問を立ててください。
回答依頼をいただいていましたが、適切な回答があったので+1してスルーしました。回答者の行動としてはこういうのが大半だと思っています。コメントで違う質問に移っても、回答者(とコメントした人)にしか通知されないので、その人以外にリーチしません。これでは皆が幸せになる仕組みになってないです。

投稿2018/12/17 08:10

papinianus

総合スコア12705

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

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

0

パラメータが足りませんね。

js

1var uhiduke = Utilities.formatDate( myValue[i][0],'JST','yyyy/MM/dd' );

【Javascript初心者がGASのformatDateの使い方を解説 - Qiita】
https://qiita.com/madebyjun/items/563ff0b387fcc58602be#案外あっさり解決

【Class Utilities  |  Apps Script  |  Google Developers】
https://developers.google.com/apps-script/reference/utilities/utilities#formatDate(Date,String,String)

投稿2018/12/09 15:34

kei344

総合スコア69407

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

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

ankou

2018/12/10 01:33

ありがとうございます。 早速ご指摘いただいた箇所を修正したテストしてみましたが メールの配信はできたのですが、日付の表示がやはり「Tue Dec 11 2018 17:00:00 GMT+0900 (JST)」になってしまいます。。
kei344

2018/12/10 01:37

提示されている範囲内に変数「uhiduke」が無いので、使っていないのでは?
ankou

2018/12/10 02:39

範囲内に「uhiduke」を挿入しました。 デバッグをしてみたのですが[uhiduke]の表示としては「2018/12/11」と表示されているので 読み取ってはいるように見えます。 ただ、「TypeError: undefined からプロパティ「0」を読み取れません。」というエラーが表示されてしまいます。 ------------------------------- //テーブルリスト、3行目~ for(var i=3;i<lastColum;i++) { item.push("<tr" + style4 + ">") for(j=1;j<7;j++) { var values = sheet.getRange(i, j).getValues(); var uhiduke = Utilities.formatDate( myValue[i][0],"JST","yyyy/MM/dd" ); item.push("<td nowrap" + style4 + ">" + style1+ values+"</font></td>"); } item.push("</tr>") } ---------------------------------
kei344

2018/12/10 02:51

提示されたコード内にも変数uhiduke が使用されていません。itemに入れるのではないのですか?
ankou

2018/12/10 03:24

itemに入れても同じエラーがでます。 入れる場所が悪いのでしょうか。。 ーーーーーーーー item.push("<td nowrap" + style4 + ">" + style1+ values+uhiduke+"</font></td>"); にしても前に持ってきても同様でした。
kei344

2018/12/10 03:28

まずエラーが出ないところに戻してください。 item.push("<td nowrap" + style4 + ">" + style1+ values+uhiduke+"</font></td>"); これはエラーで出力が出来なかっただけで、出力できるとは思います。ただ、別件ですがタグの対応が取れていない&fontタグとか時代遅れ(HTMLから廃止済み)なものを使用しているのが気になりますね。
ankou

2018/12/10 03:40

デバッグでは日付は希望の形式ではでています。 ですが送信〔実行〕すると、エラーで送信不可になります。 元々のこのHTML形式のものは 別部署で利用していたもので、それを引用する形で利用しております。 今回日付表記が必要になっているのですが、なかなか思う形にならず。。
kei344

2018/12/10 03:42

だから、エラーが出たのは移動した後ではないのですか? そこまで戻してから考えてください。
ankou

2018/12/10 07:54

エラーはできなくなり、メール送信は問題なし。 ですが、日付表記が変わらない状況です。 ↓にて送信すると、全ての表の中に「2018/12/11」と表示されてしまいます。 各行ごとに日付が異なる形で縦にならんでいるのですが、すべて同じ日付です。 ------------------------------------- for(var i=3;i<lastRow;i++) { item.push("<tr" + style4 + ">") for(var j=1;j<5;j++) { var values = sheet.getRange(i+1, j).getValues(); var uhiduke = Utilities.formatDate(myValue[2][0],"JST","yyyy/MM/dd" ); item.push("<td nowrap" + style4 + ">"+ style1+values+uhiduke+"</font></td>"); } item.push("</tr>") } item.push("</table>"); item.push("<br><br>"); item.push(style2+"以上、ご確認の程、よろしくお願いいたします。</font><br><br><br>");-------------------------------------
kei344

2018/12/10 08:00

どんな表にしているかはわかりませんが、var values = sheet.getRange(i+1, j).getValues(); で採った場所に日付があるのでは? myValue[2][0]はss.getSheetByName("★配信まとめ");の当該箇所から日付を取っていますよね。
ankou

2018/12/10 08:21

はい。その通りです。 日付があるのでメール送信しても表示はされますが書式が「Tue Dec 11 2018 17:00:00 GMT+0900 (JST)」の表記から何も変化がない状態でそこから先は全くわからない状態です。。
ankou

2018/12/10 08:46

spreadシートでは1列目の縦に日付を設定しており、5列目くらいまである表になっています。 その日付を読み込ませてGmailで送信を試みています。 表自体のメールへの本文表示は出来ています。 ただ日付の形式だけ私の無知で全くうまく表示されない状態です。
kei344

2018/12/10 09:25

values の当該列に入っているのだと思うので、そこを書き換えれば出来ると思いますよ。 【【Google Apps Script入門】セルの取得・変更をする | UX MILK】 https://uxmilk.jp/25841 【【初心者向けGAS】スプレッドシートのセル範囲の値を二次元配列として取得して取り扱う方法】 https://tonari-it.com/gas-spreadsheet-getvalues-array/
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問