Help us understand the problem. What is going on with this article?

[GAS] スプレッドシートに記載されている日付をMoment.jsでいじる

Spreadsheets/Excel Advent Calendar 2019の8日目でございます。

前提

Google Apps Scriptでは、Moment.jsが使える。
これは、とっても便利ちゃん。

日付&時刻の便利ライブラリ「Moment.js」をGoogle Apps Scriptで使う方法

やりたいこと

下記、テーブルがあって、これを
2018-07-18(水) 15:09
みたいな書式にして出力したい。

タイムスタンプ メールアドレス
2018/07/18 15:09:03 maeshow@gmail.com

え、シートに書いてあるまんまじゃん? って

やってみる

show_data.js
function show_date() {
  var
    sheet = SpreadsheetApp.getActiveSheet(),
    values = sheet.getDataRange().getValues()
  ;
  Logger.log(values[1][0]); //えーいままよ!
}
result.txt
Wed Jul 18 15:12:02 GMT+09:00 2018

え・・・なんで?

javascriptのdateオブジェクトになるらしい。
困った~。
というのも、JSのDateオブジェクトは扱いが厄介だから。
少なくとも、私は苦しんだ。二度と、そのまま触るまいと心に決めている。

Momentで扱いたい!!

Momentオブジェクトという日付の扱いをめちゃめちゃ簡単にしてくれるものが存在している。

Unixタイムスタンプに変換してしまおう

Dateオブジェクト → Momentオブジェクトの変換は、もっとスマートなやり方があるのかもしれないけれど、とりあえずUnixタイムスタンプ経由させればいけるぜ!
というわけで、Moment.moment.unic(<unix_time_stamp>)を使いたい。
魔法の呪文のご紹介~。
Math.round( <date>.getTime() / 1000 )

translate_by_Moment.js
function show_date() {
  var
    sheet = SpreadsheetApp.getActiveSheet(),
    values = sheet.getDataRange().getValues()
  ;
  var
    date = values[1][0],
    unix_time_stamp = Math.round( date.getTime() / 1000 ),
    mm = Moment.moment.unix( unix_time_stamp )
  ;
  Logger.log(mm); //オブジェクトが表示されるはず
}

書式をつけてあげよう

<moment object>.format('hoge') という感じ。
2018-07-18(水) 15:09こうなるように頑張る。

show_date.js
function myFunction() {
  var
    sheet = SpreadsheetApp.getActiveSheet(),
    values = sheet.getDataRange().getValues()
  ;
  var
    date = values[1][0],
    unix_time_stamp = Math.round( values[1][0].getTime() / 1000 ),
    mm = Moment.moment.unix( unix_time_stamp )
  ;
  Logger.log(mm.format('YYYY-MM-DD(ddd) HH:mm'));
}
result.text
2018-07-18(wed) 15:09

はい、残念~という気持ち。

日本語表記にしてあげよう

show_date_with_Japanes.js
// Momentを日本語設定に
Moment.moment.lang('ja', {
        weekdays: ["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],
        weekdaysShort: ["","","","","","",""]});

function show_date_with_Japanes() {
  var
    sheet = SpreadsheetApp.getActiveSheet(),
    values = sheet.getDataRange().getValues()
  ;
  var
    date = values[1][0],
    unix_time_stamp = Math.round( values[1][0].getTime() / 1000 ),
    mm = Moment.moment.unix( unix_time_stamp )
  ;
  Logger.log(mm.format('YYYY-MM-DD(ddd) HH:mm'));
}
result.text
2018-07-18(水) 15:09

まとめ

Moment超便利、絶対覚えよう。
(GASという茨の道をいくなら。)

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした