どうも。つじけ(tsujikenzo)です。このシリーズでは、2021年2月から始まりました「ノンプロ研GAS初級講座8期」について、講座内では伝えきれなかったことなどを、全8回でお届けします。今日は第6回(Day5)です。
前回のおさらい
前回は、「スプレッドシートの操作・基礎編」ということで、SpreadsheetAppをトップレベルオブジェクトとした、SpreadSheetオブジェクト→Sheetオブジェクト→Rangeオブジェクト、という階層構造でオブジェクトを掴んでいきましたね。
最終的には掴んだRangeオブジェクトに対して、set/get Value(s)メソッドをぶつけました。
今日のアジェンダです。
- Arrayオブジェクト
- 配列を使ったデータ処理
- 構造化データ
今回は、主に配列の操作を学習します。前回もお伝えしましたが、GASによるスプレッドシートの操作は、セルを単体でつかむことは稀で、配列で操作を進めていきます。
配列を操作する「組み込みオブジェクト[Arrayオブジェクト]」の様々なメンバー(プロパティとメソッド)を習得しましょう。
主なArrayオブジェクトのメンバー
プロパティ
Arrayオブジェクト.length
メソッド
Arrayオブジェクト.includes(値)
Arrayオブジェクト.indexOf(値)
Arrayオブジェクト.push(値)
Arrayオブジェクト.shift()
Arrayオブジェクト.flat()
flat()メソッドの引数に’Infinity’’を渡すと、強制的に1次元配列に変換するので是非覚えておいて損は無いと思います。
const array = [[[['a']]]]; console.log(array.flat(Infinity)); //[‘a’]
※Infinityは無限大を表すグローバルプロパティです。
破壊的メソッド
Arrayオブジェクト.push(値)
Arrayオブジェクト.shift()
などは、実行すると元の配列を破壊してしまいます。(配列が参照渡しだからです。)なので、元の配列はそのまま残しておいて、変化を加えた新たな配列として操作したい場合は、配列の複製を作成してから破壊的メソッドを使用する必要があります。
配列を複製する方法
配列を複製するためには、配列名にドットを3つつなげる、スプレッド構文[…配列名]というテクニックを使います。
const members2 = [...members];
「配列を壊してしまう」とはどういう動きのことでしょうか。例文を用意してみました。7~8行目を実行する場合は、10~11行目をコメントアウトして、それぞれ、元の配列[array]にどのような変化があるか、確認しましょう。
function myFunction() { const array = ['Tom', 'John', 'Bob']; const copyArray = array; const copyArray2 = [...array]; // copyArray.push('Ivy'); // console.log(array); // [ 'Tom', 'John', 'Bob', 'Ivy' ] copyArray2.push('Ivy'); console.log(array); // [ 'Tom', 'John', 'Bob' ] }
V8ランタイムになってから、やっとスプレッド構文を使えるようになりました。それまでは、複製を生成する仕様を持っているメソッドを使う必要がありました。
しかしながら、これらのメソッドは本来の処理(配列をスライスする、配列を結合する)の中から、「引数を与えなければ、配列の複製を作成する」という機能を利用したものになりますので、いまいち理解ができなかった方もいるかもしれません。
引数を与えるとどんな処理を行うかの説明は割愛しますので、リファレンスを参照ください。
配列を使ったデータ処理
前回の講座で、複数のセル範囲を操作するための、getValues()メソッドと、setValues()メソッドをご紹介しました。
特に、.getDataRange().getValues()では、スプレッドシートの値をすべて2次元配列に格納しました。今後は「2次元配列で取得して、配列を加工して、setValues()する」という一連の流れが多くなってくると思います。
赤枠のように単体セルを操作するのではなく、青枠のように、データのある範囲を.getDataRange()メソッドで2次元配列で取得して[2行目]や[B列]を配列のインデックスで操作するイメージです。
構造化データ
この、「スプレッドシートの値を配列で取得する」というアプローチは、あくまでスプレッドシートのデータ構造が、きれいな「構造化データになっている」というのが前提になります。
世の名すべてのシートが構造化データになっているわけではありません。むしろ、「セルの結合だらけ」や「1シートに複数のテーブルがある」などの「非構造化データ」の方が多いと思います。
こういったデータ構造は、人間が目で見やすいように設計されていることが多いですが、「規則性」を得意とするパソコンやプログラミングからすると、かえって処理効率を落とすことになります。
すでに社内にある「非構造化データ」を、なんとかして綺麗なデータとして抜き出す(データクレンジングといいます)方法もあります。しかし、まずはシートを新規作成することもあると思いますので、「構造化データ」を強く意識して、その後のプログラミング処理が楽になるようなデータ作りをしていきましょう。
構造化データを意識するために
テーブルとして使うシートのルールとして、以下のような項目をご紹介しました。
- 1シートに1テーブル
- A1セルからレコード×フィールド
- 空行や空列は入れない
- フィールドの見出しは1行に
- セルの結合を使わない
補講ブログらしく、補足を加えてみたいと思います。
- 1行1レコード
- 名前などの漢字データがある場合は、「ふりがな」列を用意
- データの中に,(カンマ)を使ったデータが無いか
- データは下に伸びていく
- ファイル名、シート名、見出しなどは2バイト文字(日本語など)を使ってよい
- DOVパターンを意識する
などです。構造化データを意識するときは、DOVパターンという考え方が非常に参考になりますので、こちらもご紹介させていただきます。
まとめ
以上で、「スプレッドシートの操作・実践編」でした。後半は実務でスプレッドシートを作成する際は、「構造化データ」を意識しよう、という話をしました。アプリを作成するときはもちろんですが、おおくのプログラミング処理において、「データベース」の知識は切っても切れない関係になっております。
また、データベースはとても奥が深く、体系的に学ぶのが少し難しい分野だと行っても過言ではありません。私はデータベースのことを「生き物」だと思っています。引き続き考察を続けていきたいと思います。
次回はいよいよ『卒業LT』です。みなさんのどんな発表が聞けるでしょうか。お楽しみに!
このシリーズの目次
- [ノンプロ研]GAS初級講座8期 事前課題
- [ノンプロ研]GAS初級講座8期DAY1補講 はじめてのGAS、変数、演算、データ型
- [ノンプロ研]GAS初級講座8期DAY2補講 制御構文
- [ノンプロ研]GAS初級講座8期DAY3補講 関数・配列
- [ノンプロ研]GAS初級講座8期DAY4補講 オブジェクト・GASの世界
- [ノンプロ研]GAS初級講座8期DAY5補講 スプレッドシートの操作 基本編
- [ノンプロ研]GAS初級講座8期DAY6補講 スプレッドシートの操作・実践編
- [GAS]スプレッドシートのセル考察 ~A1Notationってなに~ [前編]
- [GAS]スプレッドシートのセル考察 ~getRange()メソッドとセルアドレスリテラル~ [後編]