さて、前回は取得したシートのデータを、forEachでループさせてログに表示させましたね。
そしてA列にある日付の表示を、getTime()メソッドでシリアル値として確認しようとしたところ、エラーが出たのでした。
前回の記事をお読みになりたい場合はこちら↓をご覧くださいね。
エラーログを確認してみましょう。
ループが一度もされずにエラーが出ていますね。つまりシートの一行目でエラーになっているということです。
なぜelement[0].getTime()でエラーが出るかを知るかには、element[0]になにが格納されているかを見てみなければなりませんね。
function testDateFunction() {
const ss = SpreadsheetApp.getActiveSheet();
const whole_sheet = ss.getDataRange().getValues();
whole_sheet.forEach(function (element,index) {
console.log((index+1)+"行目は「"+element[0]+"」だよ");
});
1行目や2行目のデータはそれぞれ「サンプルシート」「日付」だと分かりました。String型ですね!
これじゃ.getTime()メソッドが使えるわけないですね(;゚Д゚)
初めにシートのデータを取得した際、.getDataRange()でシートのすべてのデータを配列に格納しました。ですのでA列が日付で始まる行以外の、1行目や2行目などの「サンプルシート」や「日付」などの文字列が取得されてしまっています。それらはそもそも日付のデータではないので、当然.getTime()メソッドを使うことはできないのです。
では配列のデータをうまいこと.getTime()で表示させるにはどのようにしたらいいでしょうか?
2つのやり方が考えられます。
方法1.A列が日付のデータの行だけを取得して、配列に格納する(シートをまるごと全部配列に格納するのはやめる)
方法2.シートはまるごと全部配列に格納するが、そのあとでA列が日付のものだけを絞り込んで新しい配列を作成する。
まずは方法1から。
A列が日付で始まるのは3行目からですので、3行目のデータから取得したいですね。
そして3行目から取得する、というのは、今後このシートにどれだけデータが追記されたとしても変わりません。始まりはいつも3行目から!(このシートに限りますよ)
ですが最終行は何行目になるでしょうか?
今のシートの状態で言えば7行ということになりますが、当然あとからデータを追加していけば最終行は変わっていきます。
なので最終行を取得する.getLastRow()を使えばいいですね。
.getLastRow()の使い方や使用上の注意点については今回のコラムの範囲を超えてしまいますので、また別の機会にアップしたいと思います<(_ _)>
const ss = SpreadsheetApp.getActiveSheet();
last_row = ss.getLastRow();
last_rowに7という数字が入りました。シートの最終行が7行目ですので、きちんと取得できていそうです。
ではR1C1形式で、3行目から7行目までのデータを取得しましょう。
const part_of_sheet = ss.getRange(3,1,last_row-2,3).getValues();
これでA3~C7までのデータが取得できました。last_rowに-2をするのを忘れてはいけません。もし忘れると、3行目から数えて7行分、ということになりますので9行まで取得されちゃいます。
先ほどのやり方と同じようにforEachでループさせると……
part_of_sheet.forEach(function (element,index) {
console.log((index+1)+"行目は「"+element[0]+"」だよ");
console.log("getTime()は"+element[0].getTime()+"だよ");
});
無事.getTime()も表示できましたね(*^-^*)
ですが、このやりかたもひとつ難があります。
たとえば途中の行に空欄が空いていたり、日付以外のデータが入っている場合……
やはり、エラーが出てしまいます(;'∀')
次に方法2です。
前回と同じように、.getDataRange()で範囲をまるっと取得します。
const ss = SpreadsheetApp.getActiveSheet();
const whole_sheet = ss.getDataRange().getValues();
この取得した配列から、A列が日付だけのものを絞り込むには.filter()というメソッドが使えそうです。
これはforEachと使い方がとてもよく似ているのですが、シンプルにループを繰り返すforEachに対し、条件に一致した要素で新しい配列を作ることができる、とても便利なメソッドです。
const filtered = whole_sheet.filter(function (element) {
return ※ここに条件式※;
});
こんな感じで書きます。
filteredの部分には、好きな変数名を付けることができます。条件式に一致した要素だけが、filteredという変数に格納されて配列ができちゃうんですね!
さて、条件の部分にはなんと書いたら良いでしょうか?
いくつかのやり方があるとは思うのですが、たとえば次のようなやり方はどうでしょうか。
const filtered = whole_sheet.filter(function (element) {
return typeof element[0] == 'object';
});
typeof とすることで、要素の型を確認することができます。element[0]、つまりA列の型を表示しているのですね。
日付はDateオブジェクトですので、もしA列の型がオブジェクト型ならばtrue、そうでないならばfalseとなり、trueとなったものだけが新しい配列filteredに格納されます。
では実行して変数filteredをログで確認してみましょう。
無事、A列が日付の列だけ表示させることができました。
ここまでくればもうできたようなものです。
〇日の日付を絞り込む、という当初の目的も、この.fiter()メソッドを使えば難しくないですよ!
では次回でいよいよこの連載は終了です!
今回も、お読みいただきありがとうございました<(_ _)>
次回の記事↓
現在出品中のサービス↓