ushisangyo
@ushisangyo

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

GASの"Range not found"エラーの対処法

解決したいこと

スプレッドシートで作成した従業員名簿を操作するGASを作っております。
実行するとインプットボックスが出現し、従業員名を入力すると該当の従業員が名簿から削除されるようなスクリプトを作成しました。
実行すると思い通りに動くのですが、なぜかエラーの表示が出てしまいます。
どなたかお詳しい方、このエラーの解決方法をご教授頂けますと幸いです。
宜しくお願いいたします。

発生している問題・エラー

エラー	
Exception: Range not found
deleteName	@ ○○○○.gs:47 //if(sh.getRange(i,2).getValue() == delName){ ☜ この部分です。

該当するソースコード

function deleteName(){
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  let sh = ss.getSheetByName('名簿');
  let lastRow = sh.getLastRow();
  
  let delName = Browser.inputBox('削除する従業員名を入力してください。', Browser.Buttons.OK_CANCEL);
  if(delName == 'cancel'){
    Browser.msgBox('スクリプトを終了します。')
    return;  
  }else{
    for(let i=6; i<=lastRow-1; i++){
      if(sh.getRange(i,2).getValue() == delName){
        sh.deleteRow(i);
        sh = ss.getSheetByName(delName);
        ss.deleteSheet(sh);  
      }
    }
  }
}


0

1Answer

表示されているスクリプトを拝見しますと、Exception: Range not foundの原因は、ループ内でshsh = ss.getSheetByName(delName)によって変更されていることによると思われます。sh = ss.getSheetByName(delName)によって、shは変更され、ss.deleteSheet(sh)によってそのシートは削除されます。これにより、そのようなエラーが発生すると思われます。

スクリプトから、今の場合、一度の実行で削除するシートは一つと理解しますので、これにより削除する行も一つになると推測します。この推測が正しいようであれば、下記のように修正するのはいかがでしょうか。

修正したスクリプト

function deleteName() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  let sh = ss.getSheetByName('名簿');
  let lastRow = sh.getLastRow();
  let delName = Browser.inputBox('削除する従業員名を入力してください。', Browser.Buttons.OK_CANCEL);
  if (delName == 'cancel') {
    Browser.msgBox('スクリプトを終了します。')
    return;
  } else {
    const range = sh.getRange("B6:B" + (lastRow - 1)).createTextFinder(delName).matchEntireCell(true).findNext();
    if (!range) return;
    sh.deleteRow(range.getRow());
    ss.deleteSheet(ss.getSheetByName(delName));
  }
}
  • この修正では、名前の検索にTextFinderを使用します。これにより、ループを使用する必要もなく、検索結果をダイレクトに取得できます。また、行数が多い場合にも検索コストは低いため便利かと思いました。

  • 検索範囲の"B6:B" + (lastRow - 1)は、表示されているfor(let i=6; i<=lastRow-1; i++)if(sh.getRange(i,2).getValue() == delName)から判断しました。

0Like

Comments

  1. @ushisangyo

    Questioner

    解決しました!
    従業員名簿の形式について説明が足りておらずすみませんでした。
    いろいろとご提案いただき、初学者として大変勉強になりました。
    ご親切にどうもありがとうございました。

Your answer might help someone💌