GASで複数行のデータをループで処理する方法

先生

GASで複数行のデータを自在に操り、業務効率を爆上げ🚀!ループ処理の基本から応用、エラー対策まで徹底解説!

GASで複数行データをループ処理する基本

Google Apps Script(GAS)でスプレッドシートなどの複数行のデータを処理する際、ループ処理は不可欠です。この記事では、GASで複数行のデータを効率的にループ処理する方法を解説します。具体的には、forループ、forEachメソッド、whileループなど、様々な方法を紹介し、それぞれのメリットとデメリットを比較します。

GASでのデータ処理は、多くの場合、スプレッドシートからデータを取得し、そのデータを加工・分析するという流れになります。そのため、スプレッドシートのデータを効率的にループ処理できることは、GASを使いこなす上で非常に重要です。

まずは、基本的なforループを使った方法から見ていきましょう。

function loopWithFor() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const lastRow = sheet.getLastRow();
  
  for (let i = 2; i <= lastRow; i++) { // 2行目から最終行までループ
    const data = sheet.getRange(i, 1).getValue(); // A列のデータを取得
    Logger.log(data); // ログに出力 (処理内容は適宜変更)
  }
}

forループは、開始条件、終了条件、増減値を指定することで、指定した範囲の処理を繰り返すことができます。上記の例では、スプレッドシートの2行目から最終行までをループし、A列のデータを取得してログに出力しています。

次に、forEachメソッドを使った方法を見てみましょう。

function loopWithForEach() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const dataRange = sheet.getDataRange();
  const values = dataRange.getValues();

  // 1行目はヘッダーとしてスキップ
  values.slice(1).forEach(row => {
    const columnA = row[0]; // A列のデータ
    Logger.log(columnA); // ログに出力 (処理内容は適宜変更)
  });
}

forEachメソッドは、配列の各要素に対して指定された関数を実行します。上記の例では、スプレッドシートのデータを二次元配列として取得し、1行目のヘッダーをスキップして、各行のA列のデータをログに出力しています。

whileループを使った方法もあります。

function loopWithWhile() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  let row = 2; // 開始行
  const lastRow = sheet.getLastRow();

  while (row <= lastRow) {
    const data = sheet.getRange(row, 1).getValue(); // A列のデータを取得
    Logger.log(data);
    row++; // 行番号をインクリメント
  }
}

GASのループ処理を効率化するテクニック

GASで大量のデータをループ処理する場合、処理速度が問題になることがあります。ここでは、GASのループ処理を効率化するためのテクニックを紹介します。

まず、スプレッドシートへのアクセス回数を減らすことが重要です。getValue()setValue()などのメソッドは、スプレッドシートにアクセスするたびに通信が発生するため、処理速度が低下します。そのため、できる限りgetValues()でデータをまとめて取得し、setValues()でまとめて書き込むようにしましょう。

// 効率が悪い例
function inefficientLoop() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const lastRow = sheet.getLastRow();

  for (let i = 2; i <= lastRow; i++) {
    const data = sheet.getRange(i, 1).getValue();
    sheet.getRange(i, 2).setValue(data * 2); // スプレッドシートへのアクセスが毎回発生
  }
}

// 効率が良い例
function efficientLoop() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const lastRow = sheet.getLastRow();
  const dataRange = sheet.getRange(2, 1, lastRow - 1, 1); // A列のデータをまとめて取得
  const values = dataRange.getValues();
  const results = [];

  for (let i = 0; i < values.length; i++) {
    results.push([values[i][0] * 2]); // 計算結果を配列に格納
  }

  sheet.getRange(2, 2, lastRow - 1, 1).setValues(results); // B列にまとめて書き込み
}

また、不必要な処理を避けることも重要です。例えば、ループ内で毎回同じ計算をする場合、ループの外で計算結果を保持するようにしましょう。

さらに、GASにはタイムアウトの制限があるため、処理時間が長すぎるとスクリプトが中断されることがあります。そのため、処理を分割したり、Utilities.sleep()を使って処理を一時停止したりするなどの対策が必要になる場合があります。

GASのループ処理におけるエラーとデバッグ

GASでループ処理を行う際、エラーが発生することは避けられません。ここでは、GASのループ処理におけるエラーとそのデバッグ方法について解説します。

よくあるエラーとしては、配列のインデックス範囲外アクセス、変数の型が異なる、スプレッドシートへのアクセス権がない、などが挙げられます。

エラーが発生した場合、まずログを確認することが重要です。Logger.log()を使って、変数の値や処理の進捗状況をログに出力することで、エラーの原因を特定しやすくなります。

function debugLoop() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const lastRow = sheet.getLastRow();

  for (let i = 2; i <= lastRow; i++) {
    try {
      const data = sheet.getRange(i, 1).getValue();
      Logger.log('Row ' + i + ': ' + data); // ログを出力
      // 何らかの処理
    } catch (e) {
      Logger.log('Error on row ' + i + ': ' + e); // エラーログを出力
    }
  }
}

また、try-catch文を使って、エラーが発生した場合に処理を中断せずに、エラーログを出力するようにすることも有効です。

さらに、GASのデバッガーを使うことで、コードをステップ実行したり、変数の値をリアルタイムで確認したりすることができます。デバッガーは、GASエディタの「デバッグ」メニューから起動できます。

参考リンク

まとめ

この記事では、GASで複数行のデータをループ処理する方法について解説しました。forループ、forEachメソッド、whileループなど、様々な方法を紹介し、それぞれのメリットとデメリットを比較しました。また、GASのループ処理を効率化するためのテクニックや、エラーとそのデバッグ方法についても解説しました。これらの知識を活用することで、GASを使ったデータ処理をより効率的に行うことができるようになります。