GASでスプレッドシートの複数行のデータを扱う時の考え方 〜例えばhideRow〜 の続き

前振り


↑これの続き。

こんなツイートがあって、ほほう、気になる。


まずは、素直に、今回のhideRowの3パターンで実行時間を測定してみます。

測定方法

consoleクラスを使います。

コードは下記の通り。
コード実行→スプシでUndo(非表示をクリアする)→コード実行スプしで以下略  といった感じで計測しました。

/**
 * B列 にチェックが付いている行を非表示にする
 */
function hideRow_01() {
  console.time('hideRow_01')
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('シート1');
  const lastRow = sheet.getLastRow();

  // 1つずつ行を検索してif節の条件に合致する場合は非表示にする
  for (let i = 1; i <= lastRow; i++) {
    const targetCell = sheet.getRange(i, 2).getValue();

    if (targetCell === true) {
      //getRange(R1C1形式)
      const range = sheet.getRange(`${i}:${i}`);
      sheet.hideRow(range);
    }
  }
  console.timeEnd('hideRow_01')
}

/**
 * B列 にチェックが付いている行を非表示にする
 */
function hideRow_02() {
  console.time('hideRow_02')
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('シート1');
  const lastRow = sheet.getLastRow();

  const targetRows = [];
  const values = sheet.getDataRange().getValues();
  // console.log(values)
  // console.log(values[0])
  // console.log(values[0][1])
  // console.log(values[1][1])
  for (let row = 0; row < values.length; row++) {
    if (values[row][1] === true) targetRows.push(row + 1); // インデックス+1
  }
  // console.log(targetRows)


  // 指定の行番号をhideRows
  for (let i = 0; i < targetRows.length; i++) {
    sheet.hideRows(targetRows[i]);
  }
  console.timeEnd('hideRow_02')
}


/**
 * B列 にチェックが付いている行を非表示にする
 */
function hideRow_03() {
  console.time('hideRow_03')
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('シート1');
  const lastRow = sheet.getLastRow();

  // 隠したい行番号を格納する配列
  const targetRows = [];
  const values = sheet.getDataRange().getValues();
  // console.log(values)


  values.forEach((rec, row) => {
    // console.log(rec, row)
    // console.log(row)
    if (rec[1] === true) targetRows.push(row + 1); // インデックス+1
  })
  // console.log(targetRows)

  // 指定の行番号をhideRows
  targetRows.forEach(row => sheet.hideRows(row));
  console.timeEnd('hideRow_03')
}

結果

分かっていたとはいえ、やっぱ早いな〜。

1回目
hideRow_01: 30654ms
hideRow_02: 462ms
hideRow_03: 437ms

2回目
hideRow_01: 14280ms
hideRow_02: 1053ms
hideRow_03: 566ms

3回目
hideRow_01: 25767ms
hideRow_02: 669ms
hideRow_03: 454ms


面白いな〜〜〜〜

雑いけど一旦めも!

#GAS
#ノンプロ研
#反復メソッド
#コールバック関数
#forEach

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