見出し画像

⑤配列を使ったデータ処理「Vol.6 スプレッドシートの操作(実践編) :ノンプロ研初心者向けプログラミング講座【GASコース第9期】

ヘッダ画像: カブと大豆サラダ。カブの実と葉っぱ、蒸し大豆。胡椒と塩、レモン汁。


↓の続きです。
(編集中)


配列を使ったデータ処理

GAS6分の壁に対処するために、配列の考え、使い方が重要になる。
また、配列を学ぶには、スプレッドシートで遊んでみるのがおすすめとのこと。
というわけで、その威力を実感すべく、実行時間を測定する。

実行時間の測定
タイマースタート
console.time(ラベル)

タイマー終了&ログ出力
console.timeEnd(ラベル)

演習6-06 実行時間を測定 1セルずつ処理

測定コードは下記の通りって、あれっ、なんだ、何がいけないんだ?
あっ、i.jドットに打ち間違ってました、ここカンマですね。

画像1

仕切り直し。

画像2

1セルずつ処理した場合: 21068ms だいたい21秒。

画像3


演習6-07 実行時間を測定 配列

同様に配列で測定してみよう。

画像4

配列で処理した場合: 3858ms 3.8秒

画像5


結果
21秒 と 3.8秒 で差が出ました。
valueで一個ずつちまちまやるより、valuesでゴソッと取るのが速い。


演習6-08 宿題

アクティブシートのデータの中に「Bob」というデータが含まれていればtrue、さもなければfalseと返す関数を作成してみましょう。

画像6

さて、まずは出題と同様のシートを作るぞう。問題文では「アクティブシート」としているが、演習を重ねてシートが増えてきている人もいるだろうから、シート名でシートを取得でもいいそうです。

コードの組み立てとしては、まずはスプレッドシートを取得して、値を取得して、それを判定して返す関数作って、という感じでいってみたい。

画像8

まずは getDataRangeで雑にごっそりデータを取った。シートの狙った範囲外にデータがあるとコケるが、今回はこれでいいかなあと。誤作動防止に、元シートの余計は範囲は削除した。これ、仕事でも使わんとこは消しておくといいですよ~と言っているのだが、なかなか浸透しない。かなしい。もっとウザく言いまくるか。意味、意図が伝わってないのかなあ。

画像9

データを取れたので、それを判定していく。演習6-04あたりと同じ考え方。

画像10

アローversion。

画像11

アロー関数がconst values の前でも動作はするが、後に置いたほうがなんかいいか気がするけど、どうなんだ。最初にシートなどの広範な定義をしてから処理する、というほうが、流れがいいというか。

演習6-09 宿題

以下二つの処理を持つスクリプトを作成してみてください。

・Arrayオブジェクトのpushメソッドを使って最終行に「team: A、name: Ron、age: 30、favorite: melon」を追加する

・Arrayオブジェクトのshiftメソッドを使って、見出し行を削除する

画像7

うーん、こういうことでいいのか?

画像12

これだと、シートには特に反映されてはいない、という状態。

こうか?

画像13

画像14


で、スプレッドシート上の見出しも消す必要があるそうなので、最終的にこうなった。

function myFunction6_09_02({
 const sheet = SpreadsheetApp.getActiveSheet();
 const range = sheet.getDataRange();
 const values = range.getValues();
 const addData = ['A''Ron''30''melon'];
 // console.log(values);

 //Arrayオブジェクトのpushメソッドを使って最終行に「team: A、name: Ron、age: 30、favorite: melon」を追加する
 values.push(addData);
 // console.log(values);

 //Arrayオブジェクトのshiftメソッドを使って、見出し行を削除する
 values.shift();
 // console.log(values);
 
 //シートの情報をすべて消す。
 sheet.clearContents();
 
 //見出し以外の情報をシートにセットする。
 //getRange(row, column, numRows, numColumns) 
 //1行目 1列目=A1から、values.length行目=5行分、values[0].length列目=4列分
 const rangeForCopy = sheet.getRange(11, values.length, values[0].length);
 rangeForCopy.setValues(values);

 //シートの最終行にaddDataの情報を追加する。
//  sheet.appendRow(addData);
}

上書きするので、sheet.clearContents(); は無くてもよいのかもしれない。
次回、構造化データに続く。


いいなと思ったら応援しよう!

good-sun(a03)
いただいたサポートで、書籍代や勉強費用にしたり、美味しいもの食べたりします!