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

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

ただいまの
回答率

89.99%

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

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,940

ankou

score 13

- 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")});
}
};
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

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

var 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/10 17:21

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

    キャンセル

  • 2018/12/10 17:46

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

    キャンセル

  • 2018/12/10 18:25

    values の当該列に入っているのだと思うので、そこを書き換えれば出来ると思いますよ。

    【【Google Apps Script入門】セルの取得・変更をする | UX MILK】
    https://uxmilk.jp/25841

    【【初心者向けGAS】スプレッドシートのセル範囲の値を二次元配列として取得して取り扱う方法】
    https://tonari-it.com/gas-spreadsheet-getvalues-array/

    キャンセル

+1

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

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

papin(n)と書いたところで手直しをしています。

  1. (1)ヘッダを増やしましょう
  2. (2)ヘッダ行を閉じましょう
  3. (3)ここでループしちゃだめ
  4. (4)ここで日付を書きましょう
  5. formatのところですが、myvalues[i]だとダメなんじゃないかと思います(rangeは1はじまり、myvaluesは配列なので0はじまり、同じiでは指せないのでi-1としました)
    →これが当初コメントで「「TypeError: undefined からプロパティ「0」を読み取れません。」というエラーが表示されてしまいます。」と言っていたところに該当するはず。
    →コメントの最後のほうで迷子になっている理由はおそらくmyvalues[2][0]と固定で2を指定してるからです。iから推論しなきゃ、そりゃ全部が同じ日付になります。
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 + ">")
        item.push("<td bgcolor='    #FFA07A' nowrap" + style4 + ">日時</font></td>"); //papin(1)
        for (j = 1; j < 8; j++) {
            var values = sheet.getRange(2, j).getValues();
            item.push("<td bgcolor='    #FFA07A' nowrap" + style4 + ">" + style1 + values + "</font></td>");
        }
        item.push("</tr>"); //papin(2)

        //テーブルリスト、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-1][0],'JST','yyyy/MM/dd'); //kei344様指摘
            //            for (var i = 3; i < lastRow; i++) //papin(3)
            item.push("<tr" + style4 + ">");
            item.push("<td nowrap" + style4 + ">" + style1 + uhiduke + "</font></td>"); //papin(4)
            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")
            });
    }
};

総評としては、

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる