GoogleスプレッドシートにScreenUpdatingはないのでGAS作成時は注意が必要

ScreenUpdatingとは

正確にはApplicaiton.ScreenUpdatingでExcel VBAで画面の更新のプロパティ。

VBAではコード内にApplicaiton.ScreenUpdating = falseを実行するとセルの処理過程で発生する画面の更新を行われなくなるため処理速度が向上する。

Sub sample()
  Application.ScreenUpdating = False
  ' 画面更新が多い処理
End Sub

GoogleスプレッドシートのGASには1行追加するだけで画面更新を行われなくなるようなプロパティは用意されていないため、順次セルに挿入していくと処理時間がかかってしまう。

function myFunction() {
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
  const sheet = spreadsheet.getActiveSheet()
  const url = 'https://iwb.jp/'
  const html = UrlFetchApp.fetch(url).getContentText()
  const metaTags = html.match(/<meta [^>]+>/gm)
  console.time('test')
  metaTags.forEach((v, i) => {
    sheet.getRange(i + 1, 1).setValue(v)
  })
  console.timeEnd('test')
}

setValues用に配列を作成して一括挿入

画面更新を最小限にするにはGASでsetValues用に配列を作成して一括挿入する。

やり方は前述の配列の場合はmapで配列内の値を[]で囲んで2次元配列にしてsetValuesで挿入するだけだ。

この方法だと最初のやり方だと順次セルを更新していたので32回も画面更新が発生していたが、setValuesは1回で済むので処理速度がかなり向上する。

function myFunction() {
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
  const sheet = spreadsheet.getActiveSheet()
  const url = 'https://iwb.jp/'
  const html = UrlFetchApp.fetch(url).getContentText()
  const metaTags = html.match(/<meta [^>]+>/gm)
  console.time('test')
  const metaTagsArr = metaTags.map(v => [v])
  sheet.getRange(1, 1, metaTags.length, metaTagsArr[0].length).setValues(metaTagsArr)
  console.timeEnd('test')
}

データが多ければ数十倍以上処理速度が早くなることもあるので、特に理由がなければデータはGASで2次元配列にしてsetValuesを使用して1回の処理だけで済むようにしたほうが良いだろう。