2012-05-25 167 views
3

背景(可选):我在VBA中编写了一个工作脚本,我试图用JS编写Google Spreadsheets,但是我遇到了大量的难题每个单元格的正则表达式验证。谷歌电子表格脚本RegEx在单元格范围

在这个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 
} 
+1

与您联系,我已经彻底地满足了“不要做什么”的翻译whoopsies的。 – Matt

+0

如果可以,下一步就是将问题的范围缩小到您的特定问题:大部分代码与您的问题无关。例如,只在VBA中包含您遇到问题的行,并在JS中显示不起作用的行。那么这将成为一个很好的问题,可能会吸引很多好的答案。 – assylias

+0

关于编辑的想法? – Matt

回答

2

下面两个例子如何使用正则表达式在JS工作,WScript.Echo是JScript中更容易测试,与文件撰写或回复于或任何

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 
2
更换

好吧,快速查看它,看起来你想检查一系列单元格中的值,将它们与正则表达式进行比较,并根据结果更改单元格颜色。请记住,我之前没有使用过google docs 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)$/]; 

两个变化有利于只是使用[ ]字面数组语法(可选的,但好的做法)的下降new Array,和用正斜杠(正则表达式文字语法)替换数组字符串中的引号。结果是一组正则表达式对象而不是字符串。这将允许你像你在评估代码中那样做re.test("some string");之类的事情。其次,您需要循环遍历单元格范围,获取它们的值并进行比较。快速检查documentation告诉我0123'返回一个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 
    } 
    } 
} 
相关问题