この連載では僕が所属しているノンプロ研で受講した、GAS初級講座での気づきをまとめています。前回の記事はこちらです。
前回はスプレッドシート操作の基本について学びました。スプレッドシート、シート、 セル範囲の取得や、セルの値の設定、取得などについてご紹介しました。
今回も引き続きスプレッドシート操作(実践編)について取り組みます。
Arrayオブジェクト
Arrayオブジェクトとは配列のことを指します。配列もオブジェクトなのです。よって 、配列の操作、確認などの作業はメソッド、プロパティで行います。前回、複数のセル範囲を指定して読み書きをする場合には、2次元配列を使用するとお話しました。Arrayオブジェクトを操作することで、スプレッドシート上のデータも色々な処理ができます。
以下に代表的なプロパティ、メソッドを御紹介します。
lengthプロパティ
配列の要素数を取得します。
Arrayオブジェクト.length
includesメソッド
配列内を検索して値が存在するかどうかをブール値で返します。
Arrayオブジェクト.includes(値)
indexOfメソッド
配列内を検索してその位置を取得します。値が存在する場合は0以上の整数、存在しない場合は-1を返します。
Arrayオブジェクト.indexOf(値)
flatメソッド
配列の次元を減らします。以下は使用例です。
//2次元配列にflatメソッドを使用する const numbers = [[10, 30], [20], [40]].flat(); //1次元の配列に変換される。 console.log(numbers); //[10, 30, 20, 40]
pushメソッド
配列の最後尾に要素を追加します。以下は使用例です。
members = ['Bob', 'Tom', 'Jay']; members.push('Dan'); console.log(members); //['Bob', 'Tom', 'Jay']
shiftメソッド
配列の先頭から要素を抜き出します。以下は使用例です。
members = ['Bob', 'Tom', 'Jay']; members.shift(); console.log(members); //['Tom', 'Jay']
pushメソッド、shiftメソッドは操作するオブジェクトに変更を加えるメソッドです。使用する場合は、元の配列の複製を作ってから操作した方が確実ですね。
配列によるデータ処理
ここまでご紹介した方法で、配列を使ってスプレッドシート上のデータを処理していくのですが、配列を使用した方法にはほかにもメリットがあります。配列を使用した場合の方が処理時間が短くて済みます。
以下のコードを実行して比べてみましょう。「console.time(label);」は時間測定の開始、「console.timeEnd(label);」は時間測定の終了と結果の表示をします。
まずはセルから1つずつデータを取ってくる方法です。
console.time(label); const sheet = SpreadsheetApp.getActiveSheet(); for(let i = 1; i <= 1000; i++) { for(let j = 1; j <= 5; j++) { const value = sheet.getRange(i, j).getValue(); console.log(value); } } console.timeEnd(label);
僕の環境では、23459msかかりました。結果の表示をしない場合は12183msでした。 続いて配列を使って同じ量のデータを取ってきた場合です。
console.time(label); const sheet = SpreadsheetApp.getActiveSheet(); const values = sheet.getRange(1, 1, 1000, 5).getValues(); console.log(values); console.timeEnd(label);
今度は、195msでした(結果を表示しない場合は170ms)。この様に配列を使ってシートの読み書きをすると、短時間で処理できます。GASには1実行あたり6分という厳しい壁があるので、この手法を使わない手はないです。
次回はHTTP通信・API
いかがでしょうか。前回の内容も含めて、スプレッドシート上のデータを処理する方法が分かってきたと思います。次回はHTTP通信・APIです。ネットを通じて他のアプリと通信したりします。お楽しみに!!