ishi14
@ishi14

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【GAS】日報承認システムの日付表示について

解決したいこと

GWS(フォーム・スプレッドシート・GAS)を活用して簡易の日報承認システムを構築しています。
承認者に自動送信されるメール内の日付表示をシンプルにしたいと考えています。

現状と理想

現状:Tue Sep 13 2022 11:49:22 GMT+0900 (Japan Standard Time)
理想:2022/09/13

※ 初心者のため皆さんの記述をコピペしながら組み合わせて構築しています。大変初歩的な質問で申し訳ありません。

記述全体

function sendEmailByEvent() {

 //シート内の全データを取得
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("確認シート");
  var data = sheet.getDataRange().getValues();

 //変更されたセルを取得、また、セルの行数を取得して配列に対応できるように-1した変数を設定
  var targetCell = sheet.getActiveCell();
  var targetCellRow = targetCell.getRow()-1;

 //メール送付先のアドレスとメール題名を設定
  var recipient1a = "担当者@gmail.com", subject1a = "課長承認完了(自動配信)"; //本番は担当者アドレスにする
  var recipient1b = "課長@gmail.com", subject1b = "課長承認内容確認|TUF承認完了(自動配信)"; //本番は課長アドレスにする
  var recipient1c = "部長@gmail.com", subject1c = "要作業|日報部長確認依頼(自動配信)"; //本番は部長アドレスにする
  var recipient2a = "担当者@gmail.com", subject2a = "部長最終承認のお知らせ(自動配信)"; //本番は担当者アドレスにする
  var recipient2b = "課長@gmail.com", subject2b = "部長最終承認のお知らせ(自動配信)"; //本番は課長アドレスにする
  var recipient2c = "部長@gmail.com", subject2c = "部長承認内容確認|部長最終承認のお知らせ(自動配信)"; //本番は部長アドレスにする

 //メール本文用に、取得したセルの行データをbody配列にpushする
  var body = []
  body.push(data[targetCellRow])

  var datatitle = data[0];//タイトル行を取得

  body = '\― 本メールは自動配信メールです ―\n\n'
  body += '以下の通り日報が承認されました。\n\n';

  datatitle.forEach((v,i) => body +=" "+v+"|"+data[targetCellRow][i]+"\n"); //タイトル+取得した項目+改行をbodyに追加を繰り返し

 //今回のメイン。G行が提出かつH行とI行の文字列をみて判定しメールを送付
  if(targetCell.getColumn() === 8){ //8は8行目=H行のこと?
    if(data[targetCellRow][6] == "提出" && data[targetCellRow][7] ==="完了") //提出日(タイムスタンプ)とメールアドレスを除く[6]はH行/[7]はI行?
     GmailApp.sendEmail(recipient1a, subject1a, body)
     GmailApp.sendEmail(recipient1b, subject1b, body)
     GmailApp.sendEmail(recipient1c, subject1c, body)
  }
  if(targetCell.getColumn() === 9){ //9は9行目=I行のこと?
    if(data[targetCellRow][6] == "提出" && data[targetCellRow][8] ==="完了") //提出日(タイムスタンプ)とメールアドレスを除く[6]はH行/[8]はJ行?
     GmailApp.sendEmail(recipient2a, subject2a, body)
     GmailApp.sendEmail(recipient2b, subject2b, body)
     GmailApp.sendEmail(recipient2c, subject2c, body)
  }

}

参考にしているサイト

自分で試したこと

GASの日付を文字列に変換すればよいことが分かったため、

function myFunction() {
 //実行した日付のオブジェクトをtoday変数に格納する
 let today = new Date();

 //Dateオブジェクトのtoday変数をログ出力する
 Logger.log(today);

 //formatDateメソッドで日付の表示形式を変換する
 today = Utilities.formatDate(today,"JST", "yyyy/MM/dd");

 //formatDateメソッドで変換後をログ出力する
 Logger.log(today);
}

以上の記述をどこかに入れればよいのかと思ったのですが、どこに追記してもうまく作動しません。

大変初歩的な質問であること承知の上ですがご教示いただけますと幸いです。
@tanaike 様のサポートにより無事解決いたしました!

2022/11/16追記
追加でお聞きしたいことを記載しておりましたが別途質問を立てることにしました。

0

2Answer

現状:Tue Sep 13 2022 11:49:22 GMT+0900 (Japan Standard Time)から、取得したセルの値はDateオブジェクトであると推測します。表示されているスクリプトの場合、次のような修正はいかがでしょうか。

From

datatitle.forEach((v,i) => body +=" "+v+"|"+data[targetCellRow][i]+"\n");

To

datatitle.forEach((v, i) => body += " " + v + "|" + (data[targetCellRow][i] instanceof Date ? Utilities.formatDate(data[targetCellRow][i], Session.getScriptTimeZone(), "yyyy/MM/dd") : data[targetCellRow][i]) + "\n");
  • セルの値がDateオブジェクトの場合は、Utilities.formatDateを使ってフォーマットを変更しています。
2Like

Comments

  1. @ishi14

    Questioner

    @tanaike 様

    ご教示いただいたスクリプトに変更し無事思い通りの記載になりました。

    ご回答いただき誠にありがとうございました。

myFunctionでの変換結果をメインプログラムに渡せていません。
myFunctionの最終行(Logger.logの下)に以下を追記すれば良いかと思います。

return today;

1Like

Comments

  1. @ishi14

    Questioner

    kfyuta 様

    回答いただきありがとうございます。

    本当に初歩的で申し訳ないのですが、

    return today; を追記して
    myFunction 全体を
    sendEmailByEvent 内に記述することになるでしょうか?

    それとも、GASで
    sendEmailByEvent とは別のスクリプトを追加することになるでしょうか?
  2. 以下どちらかになります。sendEmailByEventメソッドが記述されている.gsファイル内で、sendEmailByEventメソッドの外に記述。

    sendEmailByEventが記述されている.gsファイルが存在するプロジェクトに新たに.gsファイルを作成して記述

    なおスプレッドシートに記載の日付を変換したいというのが要件でしたら、tanaike様の方法で上手くいくと思います。
    myFunctionを活用して上記の要件を満たしたい場合はmyFunctionに引数として変換したい日時(この場合スプレッドシートに記載されている日時でしょうか)を渡してあげる必要があります。
  3. @ishi14

    Questioner

    kfyuta 様

    記述場所についてよくわかりました。
    基本的な内容にもかかわらずご丁寧に回答いただき感謝申し上げます。

    tanaike様にアドバイスいただいた方法でも試してみたいと思います。

Your answer might help someone💌