3

背景 (オプション) : Google スプレッドシート用に JS で記述しようとしている VBA で動作するスクリプトを記述しましたが、セルごとの正規表現検証に非常に苦労しています。

この VBA コード スニペットでは、データの範囲を設定し、事前に定義された RegEx に対して各セルをテストします。

Set rRange = Range(arrLetters1(i) & intRange1, arrLetters2(i) & intRange2)

For Each rCell In rRange.Cells
  If re.Test(rCell) Then
    rCell.Interior.Color = RGB(0, 250, 0)
  Else
    Cells((intRange1 - 1), rCell.Column).Interior.Color = RGB(250, 0, 0)
    rCell.Interior.Color = RGB(250, 0, 0)
  End If
Next rCell

私が興味を持っているのは、同じ範囲を調べて同じ操作を実行できる実際のJavaScript関数です。ここに私が持っているものがあります:

var re = "[a-z]+"
var rRange = sheet.getRange(arrLetters1(i) + intRange1, arrLetters2(i) + intRange2)

for (var rCell in rRange) {
  if (rCell //is a "re" match) {
      //do some code
  }
} else {
     //do something else
}
4

2 に答える 2

2

さて、これをざっと見てみると、セルの範囲内の値を調べ、それらを正規表現と比較し、結果に基づいてセルの色を変更したいようです。以前に Google ドキュメント API を使用したことがないことを覚えておいてください。既存のコードにいくつかの小さな問題があるようです。

まず、正規表現を正しく作成する必要があります。

あなたの行:

var arrPatterns = new Array("^([A-Z]{2}(-[0-9]{5}){4})$", "^[A-Z]{2}$", "^[0-9]{5}$", "^[a-z]{1,}$", "^\(\d\d\d\) \d\d\d-\d\d\d\d$", "^([a-z0-9]{1,}[,]{0,}){1,}$", "^(\d\d?:\d\d[aApP][mM] - \d\d?:\d\d[aApP][mM])|(Closed)|(All Day)$");

なります:

var arrPatterns = [/^([A-Z]{2}(-[0-9]{5}){4})$/, /^[A-Z]{2}$/, ... /^(\d\d?:\d\d[aApP][mM] - \d\d?:\d\d[aApP][mM])|(Closed)|(All Day)$/];

そこにある 2 つの変更はnew Array、リテラル配列構文[ ](オプションですが、良い習慣と見なされます) を使用することと、配列文字列内の引用符をスラッシュ (正規表現リテラル構文) に置き換えることを支持して削除されています。結果は、文字列ではなく、正規表現オブジェクトの配列になります。re.test("some string");これにより、評価コードで行ったのと同じようなことを実際に行うことができます。

次に、セルの範囲をループし、それらの値を取得して比較する必要があります。ドキュメントを簡単に調べると、がオブジェクトをsheet.getRange返すことがわかりRangeます。範囲オブジェクトには、getValuesセル値の配列の配列 (array[][]) を返すメソッドがあります。

したがって、必要なもののすぐに近似するコードは次のとおりです。

var rRange = sheet.getRange(arrLetters1(i) + intRange1, arrLetters2(i) + intRange2);
var values = rRange.getValues();
var re = arrPatterns[0];

var row, col;
for (row = 0; rows < values.length; row++) {
  for (col = 0; col < values[row].length; col++) {
    if (re.test(values[row][col])) {
        /*do passes regex, looks like you probably need to pass the row/col to getCell
          to get a range with the desired cell in it and then call setBackgroundColor on
          that range.  I'm also leaving looping through your array of regular expressions to you,
          as it looked like you have a dependency on the expression being used and the array of
          letters i didn't take the time to understand.*/
    }
    else {
      //do fails regex
    }
  }
}
于 2012-05-25T16:32:23.037 に答える
2

ここでは、JS で RegEx を使用する方法の 2 つの例を示します。WScript.Echo はテストを容易にするための JScript であり、document.write または response.write などに置き換えます。

var rRange = "this string is for testpurposes"
var re = /[a-z]+/
var regExp = new RegExp(re);
if (rRange.match(regExp)) {
  WScript.echo("Successful match");
} else {
  WScript.echo("No match");
}

=>Successful match

var str="The rain in SPAIN stays mainly in the plain"; 
var n=str.match(/ain/g);
WScript.echo(n); 
=> ain,ain,ain
于 2012-05-25T16:23:20.903 に答える