2012-05-25 213 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 
    } 
    } 
} 
相關問題