1

私はフォーラムを検索し、これを一般的にトラブルシューティングするのに丸 2 日を費やしましたが、私は比較的 Ja​​va に慣れていないため、初心者が基本に違反している可能性があります。その点はご容赦ください。

コンテキスト: 私がコーディングしているビジネス ケースでは、SQL クエリが主キーと外部キーを使用して 2 つのテーブルをクエリするように、2 つの別々の Google スプレッドシート ファイル間でレコードを比較する必要があります。簡単にするために、それぞれのスプレッドシート ファイルの 2 つの範囲が別々の配列に読み込まれ、主キーと外部キーとして機能するフィールドが一致するかどうかが比較されます。

問題: コードが実行され、デバッガーを使用して観察したところ、IF ステートメントが評価される場合は一致が識別されるはずですが、IF ステートメントは評価に失敗し、そのような一致は識別されません。付随する再構成でコードを実行したときに生成されるログでこれを簡単に確認できるようにしました(i = 2 で、一致する値は 32 です)。

比較対象のフィールドのデータ型が 2 つのスプレッドシートで同じであることを確認し、配列値が浮動小数点数の場合に備えて、さまざまな比較演算子を試しました。さらに、付随する再構築で使用される構文の代わりに [ [ ],[ ] ] 構文で配列を宣言した後、for ループを使用して配列をロードしようとしました。そして最後に、関数の引数が配列にまったく格納されていない場合にのみ、IF ステートメントが適切に評価されるようにしました。しかし、これは、後述する制約のために不十分な解決策です。

制約: 配列の使用を排除する回避策は、配列に 1 つの値をロードするために単数形の getValue() メソッド (複数形の getValues() メソッドではなく) を使用しようとした場合のように、サーバーへの呼び出しが急増する場合は実用的ではない可能性があります。一度に。この現象は、比較対象の 2 つのテーブルが同じファイルにあるため、付随する再構成では観察されません。

また、配列にロードされた 2 つのシリーズは、付随する再構成では隣接する列にありますが、実際の使用例ではそうではありません。そのため、2 つの getValues() メソッドを 1 つに統合する回避策も実用的ではありません。

成功の様子: コードの実行後、「return」という名前の変数がログで未定義でなくなると、一致が識別されて保存されます。

補足資料: この問題の本質は、説明のためにこの Google スプレッドシートに再構成されています。以下のコードをコピーします。

function simulation() {

  var thisSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var nameObj = {}
  var nameArray = []
  nameObj.name = thisSheet.getRange(2,1,3,1).getValues();
  nameObj.number = thisSheet.getRange(2,2,3,1).getValues();
  nameArray.push(nameObj);

  var vendorObj = {}
  var vendorArray = []
  vendorObj.vendorName = thisSheet.getRange(2,4,3,1).getValues();
  vendorObj.vendorNumber = thisSheet.getRange(2,5,3,1).getValues();
  vendorArray.push(vendorObj);

  for (var i = 1; i < vendorArray[0].vendorNumber.length + 1; i++) {
    matchOnNumber(nameArray,vendorArray[0].vendorNumber[i - 1]);
  }
}


function matchOnNumber(nameArray, vendorNumber) {
  var thisSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  for (var i = 0; i < nameArray[0].name.length; i++) {
    Logger.log("vendorNumber = " + vendorNumber + ", i = " + i + ", Matched against: " + nameArray[0].number[i]);
    if (nameArray[0].number[i] == vendorNumber) {
      var result = nameArray[0].number[i];
    }
  }
  Logger.log("Result: " + result);
  return result;
}
4

1 に答える 1