2012-05-25 3 views
3

배경 (선택 사항) : VBA에서 Google 스프레드 시트 용 JS로 작성하려고하는 작업 스크립트를 작성했지만, Google 스프레드 시트에 막대한 양의 어려움이 있습니다. regex 검증은 셀 단위로합니다.Google 스프레드 시트 스크립트 셀 범위에 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 

는, 내가 같은 범위를 통해 모양과 같은 작업을 수행 할 수 있도록 할 실제 자바 스크립트 기능입니다. 여기에 내가 가진 무엇 : JS에서 정규식 작동하는 방법은 다음과

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

2 예는 WScript.Echo는 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 
2
로 교체, 쉽게 테스트의 JScript입니다

좋아, 빨리 살펴보면 셀 범위의 값을 검사하여 정규 표현식과 비교하고 결과에 따라 셀 색상을 변경하려는 것처럼 보입니다. 이전에 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)$/]; 

이 단지 [ ]의 문자 배열 구문 (선택 사항이지만 간주 좋은 연습)를 사용하여 찬성 new Array을 삭제하는 두 가지 변경하고, 배열 문자열의 따옴표를 슬래시 (정규식 리터럴 구문)로 바꿉니다. 결과는 문자열 대신 정규 표현식 객체의 배열입니다. 그러면 평가 코드에서 수행 한 것처럼 실제로 re.test("some string");과 같은 작업을 수행 할 수 있습니다.

둘째, 셀 범위를 반복하고 값을 가져와 비교를 수행해야합니다. documentation의 빠른 검사는 sheet.getRangeRange 개체를 반환한다고 알려줍니다. 범위 객체에는 셀 값 배열 (array [] [])을 반환하는 getValues 메서드가 있습니다.

그래서 당신이 원하는에 대한 몇 가지 빠르게 대략적인 코드는 : 귀하의 링크에 관한

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 
    } 
    } 
}