Google Apps Scriptで指定のキーワードが含まれる行を削除する

Google Apps Scriptで指定のキーワードが含まれる行を削除したいことがあると思います。そのときにどのように処理すればいいのか解説します。

スポンサーリンク

サンプルとして扱うデータ

サンプルデータはこのように名前、年齢、性別が書かれてあるデータを用意しました。この中から「鈴木」が含まれる行だけ削除してみたいと思います。

スポンサーリンク

指定のキーワードが含まれる行は削除する。

以下のコードは鈴木が含まれる行だけ削除します。

function myFunction(){
  const sheet = SpreadsheetApp.getActiveSheet();
  const values = sheet.getDataRange().getValues();
  for (let i = values.length - 1; i >= 0 ; i--){
    let result = values[i].indexOf("鈴木")
    if(result !== -1){
      sheet.deleteRow(i + 1);
    }
  }
}

3行目 : Rangeオブジェクトに対してgetValues()メソッドを使うとセルの値を含んだ多次元配列が取得できます。

4行目 : forループで逆から処理します。逆から処理する理由は行削除するとシートのデータは自動的にずれますので、普通に処理すると思ったとおりの挙動になりません。これは実際にやってみるとわかります。

5行目 : indexOf()は配列の値に指定のキーワードが含まれている場合にその位置を返します。逆に含まれていない場合は「-1」を返します。つまり indexOf() の返り値が「-1」ではなかったら指定のキーワードが配列内に含まれているということになります。

7行目 : ここで deleteRow() を使って実際に行を削除します。i + 1 としている理由は配列の番号とシートの番号を合わせるために行っています。

indexOf()のかわりにinclude()を使う

function myFunction() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const values = sheet.getDataRange().getValues();  
  for (let i = values.length - 1; i >= 0; i--) {
    if (values[i].includes("鈴木")) {
      sheet.deleteRow(i + 1);
    }
  }
}

include() を使うともっとシンプルに書けると思います。

先に削除する行番号の配列を取得しておきそのあとに削除する

少し回りくどいやり方になりますがこのようなやり方も知っておいてもいいかもしれません

function myFunction() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const values = sheet.getDataRange().getValues();
  const rowsToDelete = [];

  // 鈴木が含まれている行を特定してrowsToDeleteに追加
  for (let i = 0; i < values.length; i++) {
    if (values[i].includes("鈴木")) {
      rowsToDelete.push(i + 1); // 行番号を1から始まる形式で追加
    }
  }

  // rowsToDeleteを逆順にして行を削除
  rowsToDelete.reverse().forEach(row => {
    sheet.deleteRow(row);
  });
}

まず鈴木が含まれている行だけを rowsToDelete という配列にストックしておきます。この行の配列をreverse()で逆順にして処理すれば、先ほど行った処理と同じことができます。

まとめ

Google Apps Scriptで指定のキーワードが含まれる行を削除したい場合は indexOf() または include() を使ってキーワードが含まれているか調べて deleteRow() を使って削除しましょう。for文を使う場合は逆順で処理しましょう。

コメント

タイトルとURLをコピーしました