見出し画像

ノンプロ研GAS中級講座 第1回 スコープと関数 その3 getMaxRows getMaxColumns

前回のnote

演習1-08 getMaxRows()&getMaxColumns()メソッド編

前回のnoteでは、lengthで計算していたので、別解としてgetMaxRows()&getMaxColumns()メソッドを考えてみます。

まずはリファレンスを見てみます。

https://developers.google.com/apps-script/reference/jdbc/jdbc-prepared-statement?hl=en#getmaxrows

getMaxColumns

画像1

Returns the current number of columns in the sheet, regardless of content.

getMaxRows

Returns the current number of rows in the sheet, regardless of content.
内容に関係なく、シートの現在のrow数を返します。


サンプルコード動作確認

のへん、文字だけ見ててもよくわからんので、サンプルコードを走らせて確認してみる。

画像3

画像3

おや、このシートでは、columnは3と出ることを期待したいが、26だ。
26はなんの数字かというと、A~Z列までの26ということになる。
データが入っていなくてもカウントするのね。
ということは、下図のように使用しないところは削除すれば、当初期待した3でログ出力するはず。

画像4

画像5

うん、そういうことね。ということは、使用しない行列は削除しておいたほうが吉なんだろうか?最大500万だからそうそう埋まらないような気もするが、節約したいなら消しておく、とかかな。

getMaxRows も試してみる。

画像6

さっきのコードに Logger.log(first.getMaxRows()); を追加。
で、行は空白含めて1000行あるから 1000.0になってる。

行を消せば、その分の測定になる。

画像7

画像8

ん~~~?ということはだ、空白の行列で運用している場合、getMaxRows/column だと、空白行もカウントしちゃうよね?
単純に使用されているセルという判定ならば、values.lengthのほうがいいのでは?

使用していない行列は消しておけということか?

values.lengthのコード

const SS = SpreadsheetApp.getActiveSpreadsheet();//Spreadsheetオブジェクト
function getRestCell() {
 console.log(returnRestCell(SS));
}
function returnRestCell() {
 const maxCell = 5000000;
 const sheets = SS.getSheets();
 let usedCell = 0;
 for (const sheet of sheets) {//シートの枚数分処理
   const values = sheet.getDataRange().getValues();
   usedCell += values.length * values[0].length;
 }
 return maxCell-usedCell;//=残り使用可能なセル数
}


getMaxRows/columnのコード

さて、前回はlengthで計算してたので、ここをgetMaxRows*getMaxColumnsに置き換えればイケるでしょうか?

あ~、前回のコード、試しにグローバル領域に書いてしまったから、共通で呼び出せていいといえばいいけど、同プロジェクト内の別ファイルからも呼び出せちゃうから、やっぱ注意だな。

function getRestCell() {
 const ss = SpreadsheetApp.getActiveSpreadsheet();//Spreadsheetオブジェクト
 console.log(returnRestCell(ss));
}

function returnRestCell(ss) {
 const maxCell = 5000000;
 const sheets = ss.getSheets();
 let usedCell = 0;
 for (const sheet of sheets) {//シートの枚数分処理
   usedCell += sheet.getMaxColumns() * sheet.getMaxRows();
 }
 console.log(usedCell);
 return maxCell - usedCell;//=残り使用可能なセル数
}

ちょっと直して、こんな感じで。


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