

画像のような管理表の各シート1行目から10行目を取得して、自分の欲しいラベル名との照合率を見て、一致率の一番高い文字列の列数を返して、シートリストの右側にラベルの列リストを作成したいと考えています。

`for(j=0;j<=searchRange0[k].length;j++){` の部分で以下のエラーが返ってきます。

**エラーメッセージ:**

[code]

    TypeError: Cannot read properties of undefined (reading 'length')
    NearStringColumn2   @ TEST.gs:26` 
    
[/code]

console.logなどで配列や変数の状態を確認してところ、forループの変数`k`と`j`は配列の最終まで処理を完了しているのですが、その先に行くためステップアウトするとエラーになります。

弱小零細企業に最近就任した社長様がGoogleWorkspaceを導入しました。もともとExcelもまともに使えていなかった社員達ですので、管理表もずさんで、フォーマットが統一されていません。  
一見見た目は同じ管理表なのですが、ラベルの行が異なったり、ラベル名が入力ミスしていたり、文言が変わっていたり、順不同になっていたりと、大変です。

現在データベースや管理システムの構築をシステム会社に依頼しているようなのですが、かなり難航しているようで、ひとまずは、勉強も兼ねてチャレンジした方が自分のためだと思い、取り組んでいる次第です。  
※画像のシートはサンプルとして作成しました。

**現状のコード:**

[code]

    function NearStringColumn2() {
      var s1 = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
      var url1 = s1.getRange("A12").getValue();
      var sheetNames = s1.getRange("A14:A100").getValues();
      var setCell = s1.getRange("AK14");
      for (f=0;f <=sheetNames.length;f++) {
        console.log(f);
        
        if(f === sheetNames.length - 1||sheetNames[f][0] === ''||sheetNames[f+1][0] === '' ) { 
          break;
        }else {
          var sheetName = sheetNames[f][0]; console.log(sheetName);
          var openS = SpreadsheetApp.openByUrl(url1).getSheetByName(sheetName);
          var lastC = openS.getLastColumn();
          var openSsetA1 =openS.getRange("A1");
          var searchRange0 = openSsetA1.offset(0,0,10,lastC).getValues();
          var searchStrings0 = ["A","B","C","D","E","F","G","H","I"];
    
          for (i=0;i<=searchStrings0.length;i++) {
            var log_i = i;
            var searchStrings = searchStrings0.map(row0 => row0.toString());
            var searchString = searchStrings[i];
    
            for(k=0;k<=searchRange0.length;k++){
              var log_k = k;
              for(j=0;j<=searchRange0[k].length;j++){
                var log_j = j;
                var searchRange = searchRange0.map(row1 => row1.map(column1 => column1.toString()));
                var currentRange = searchRange[k][j];
     
              }  
            }
          }
        }
      }
    }
    
[/code]

[![](https://i.stack.imgur.com/4ZRXN.png)](https://i.stack.imgur.com/4ZRXN.png)

[![](https://i.stack.imgur.com/poMEH.png)](https://i.stack.imgur.com/poMEH.png)


CC BY-SA 4.0
2023-04-23T06:12:48.477
94622
2023-04-24T16:43:15.443
2023-04-23T08:07:55.463
3060
58036
question
google-apps-script google-spreadsheet
GAS ループの範囲エラー


各所の `for` でやりたいことが「`XXX.length`で取得した数値の分だけループする」のであれば、 `for` 文での指定方法が正しくありません。
**`<=` ではなく `<` とする**必要があります。

※エラーの該当箇所周辺より

[code]

    // <= ではなく <
    // for(k=0;k<=searchRange0.length;k++){  
    for(k=0;k<searchRange0.length;k++){
      var log_k = k;
      // <= ではなく <
      // for(j=0;j<=searchRange0[k].length;j++){
      for(j=0;j<searchRange0[k].length;j++){  
        // 略  
      }
    }
    
[/code]

GASの配列は添字が`0`からの開始となるため、例えば`array.length`が`5`だった場合は、最後の添字は`4`となります。  
とろこが、`for`文内の2番目の式=反復処理に入るかの比較判定で `<=` を使っているため、`5`までがループの対象となり `array[5]`
のような「存在しない箇所」を参照しようとします。  
そのため、`undefined`な値から`length`プロパティを読み取ろうとしてしまい、質問文にあるエラーが発生してしまっています。

## シンプルな事例

[code]

    const data = [1, 2, 3, 4, 5];
    
    console.log("length=", data.length);
    
    for (let idx = 0; idx <= data.length; idx++) {
      console.log(data[idx]);
    }
    
[/code]

[code]

    length= 5
    1
    2
    3
    4
    5
    undefined
    
[/code]


CC BY-SA 4.0
2023-04-24T16:17:32.393
94638
2023-04-24T16:43:15.443
2023-04-24T16:43:15.443
2784
2784
94622
answer