どうも。つじけ(tsujikenzo)です。2020年11月から始まりましたノンプロ研GAS初級講座7期ですが、このシリーズでは講座中では時間の都合でお伝えできなかったことなどを、全6回+おまけという感じでお届けしております。本日は6回目で最終回です。涙💦
前回のおさらい
前回は「スプレッドシートの操作・基礎」について学びました。Spreadsheet APPをトップレベルオブジェクトとしたSpreadSheetオブジェクトSheetオブジェクトRangeオブジェクトの階層構造でスプレッドシートを掴んでいきました。
set/get Value(s)メソッドでスプレッドシートを操作できて感動でしたね。

DAY6補講 スプレッドシートの操作(実践編)
アジェンダ
- Arrayオブジェクト
- 配列を使ったデータ処理
- 構造化データ
今回は配列の操作を極めます。配列の操作を極めることが、実践で戦うことの第一歩だからです。配列を操作する組み込みオブジェクト[Arrayオブジェクト]のメンバー(プロパティとメソッド)をガンガン紹介していきます。
Arrayオブジェクト
プロパティ
Arrayオブジェクト.length
メソッド
Arrayオブジェクト.includes(値)
Arrayオブジェクト.indexOf(値)
Arrayオブジェクト.flat()
Arrayオブジェクト.push(値)
Arrayオブジェクト.shift()
flat()メソッドの引数に’Infinity’’を渡すと、強制的に1次元配列に変換するので是非覚えておいて損は無いと思います。
“` const array = [[[[‘a’]]]]; console.log(array.flat(Infinity)); //[‘a’] “`

※Infinityは無限大を表すグローバルプロパティです。

破壊的メソッド
Arrayオブジェクト.push(値)
Arrayオブジェクト.shift()
などは実行すると元の配列を破壊してしまいます。(配列が参照渡しだからです。)なので、元の配列はそのまま残しておいて、変化を加えた新たな配列として操作したい場合は、配列の複製を作成してから破壊的メソッドを使用する必要があります。
配列を複製するメソッド

講座では省きましたが、これらの2つはメソッドに引数を与えなければ、どちらも「配列の複製を作成するメソッド」になります。引数を与えるとどんな処理を行うかの説明は割愛しますので、リファレンスを参照ください。


実際にコードを動かして確認してみましょう。membersというオリジナルの配列には変更を加えたくないのに、8行目までの書き方だと要素が追加されてしまっていますね💦
“` function myFunction6_05_2() { let members = [[‘Bob’, 25, ‘apple’]]; let members2 = members; members2.push([‘Jay’, 28, ‘grape’]); console.log(members); console.log(members2); members = [[‘Bob’, 25, ‘apple’]]; members2 = members.slice(); //concat()でも可 members2.push([‘Andy’, 35, ‘banana’]); console.log(members); console.log(members2); } “`
なので、9行目以降のように、事前に配列の複製を作成する必要があります。
※ちなみにスプレッド構文[…配列名]を使うことで、配列の複製を簡単に作成することができます。今回はメソッドの紹介をしていたので、スプレッド構文はご紹介しませんでした。
“` const members2 = […members];
“`
上記のletを使った書き方がイマイチ理解できないという方は下記写経にチャレンジしてみてくださいね。

配列を使ったデータ処理
スプレッドシートの値を操作するのは、.getDataRange().getValues()で一度に2次元配列に格納してからです。皆さんにこれから沢山やっていただきたいことは「2次元配列で取って、配列を操作して、2次元配列でsetValues()」です。
赤枠のように単体セルを操作するのではなく、青枠のように、データのある範囲を.getDataRange()メソッドで2次元配列で取得して[2行目]や[B列]を配列のインデックスで操作するイメージです。


構造化データ
既にデータベースを取り扱うRDB(リレーショナルデータベース)ソフトを触っている方は自然と身近な存在になっていると思いますが、シートに「結合セル」や、グラフなどの画像、他のシートからの参照などがあるとデータが取れなかったり、狙い通りのセルにアクセスできなかったりします。
なのでデータをExcelなどの表計算ソフトで扱う場合は、DOVパターンという意識が必要になってきます。(データベースの基礎については後日ブログ連載を開始します)

まとめ
以上で、DAY6の振り返りと補足でした。全講座6回は以上となります。お疲れ様でした~。(寂しい)
残すはいよいよ卒業制作のLT発表のみです!ノンプロ研ペアプロ部では卒業制作を一緒に考えましょうという企画もありますので、ぜひSlackを覗きに来てください!では卒業LTで会いましょう~。