2015-02-02 6 views
1

URL을 수정하기 위해 간단한 Google 시트 기능을 작성했습니다. 이 함수는 값 배열을 수동으로 전달할 때 브라우저에서 정상적으로 작동합니다. Google 시트에서 호출 할 때 함수는 다른 모든 행에 대해 에 대해 실패합니다.Google 시트 맞춤 함수 (정규식이없는 경우)에서 사용되는 행이 번갈아 바뀌는 경우

수식을 한 행 아래로 이동하거나 각 셀에 대해 개별적으로 호출하여 "실패한"행에 대해 작업 할 수 있으므로 데이터에 문제가 없습니다. 내 생각에 이것은 Google 시트 안에 regex의 문제 일 수 있습니다. 의 교류 행의

else { 
    var matches = /^(http:\/\/.*\/\d\/.*_)(.*)(\/g\d+p.*)$/ig.exec(input.toString()); 
    ... continues as normal 

:

var pattern = /^http:\/\/(.*\/\d\/.*)_(.*)\/(g\d+p.*)$/ig; 

function encode(input) { 
    if (!input) return ""; 
    if (input.map) { 
    return input.map(encode); 
    } else { 
    try { 
     // same error happens, at this location, w/ or w/o toString() 
     var matches = pattern.exec(input.toString()); 
     return matches[1] + encodeURIComponent(matches[2]) + matches[3]; 
    } catch (e) { 
     return "error=" + e.message + " value = [" + input + "] "; 
    } 
    } 
} 

편집 : 정규식은 "다른"절 안에있을 때 후 오는 사람들을위한 일을 명확하게하려면,이 또한 같은 방법으로 실패 내가 시도

error=Cannot read property "1" from null. value = [ http://... ] 

:

데이터,이 오류 메시지가
  • 이 같은 데이터가 장애 경우

(1의 값을 수행하는 하나의) 두 개의 분리 함수 작성 encode{} 함수

  • 내부 정규식 퍼팅 try{}
  • 내부 정규식 퍼팅 :

    • A1-A8은
    • B1은 화학식 "= 인코딩을 갖는 이들의 URL (A1이 : A8) "B1에서
    • 데이터, B3, B5, B7 완벽
    • 가 B2, B4, B6, B8 에러 아웃
    • 데이터 (내 오류 메시지가 셀 식 이동

    )를 도시 계산 "B2"라고 말하면 =encode(A2:A8)은 "실패한"행을 계산하고 다른 행은 실패하게 만듭니다!

  • +0

    중요한 부분에서 오류 메시지를 정확히 잘라내 지 않고'value = [http : // ...]'의 값은 무엇입니까? – funkwurm

    +0

    정규 표현식에 전역 플래그가있는 이유가 있습니까? 확실하지는 않지만, 전 정규 표현식에 이어 정규 표현식이 색인에서 실행될 가능성이 있다고 생각합니다. – AdamL

    +0

    아담, 지금 살펴 보겠습니다. 습관이 없어서 배열을 통과 할 때 * 외부 * Google 시트가 잘 작동합니다. -/ –

    답변

    3

    짧은 답변 (OP에 대한 의견에 의해 확인 됨)은 정규식에서 마지막 "g"(전역 플래그)를 제거하는 것입니다.

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec

    구문 regexObj.exec (STR) 정규 표현식과 일치하는 대한

    매개 변수STR 문자열


    .

    ... 정규 표현식은 "g"플래그를 사용하는 경우

    , 동일한 문자열에서 연속 상대를 만나() 방법을 여러 번 간부를 사용할 수 있습니다. 이렇게하면 정규 표현식의 lastIndex 속성 으로 지정된 str의 하위 문자열에서 검색이 시작됩니다. test()도 lastIndex 속성 을 전달합니다.

    그래서 동일한 문자열에서 일치하는 항목을 계속 검색하려면 글로벌 플래그 만 포함해야합니다.

    다른 환경에서 작동하는 이유는 확실하지 않습니다. 실제로 exec을 완전히 새로운 문자열에 적용하더라도 부분적으로 검색을 계속 하시겠습니까? . 아마도 GAS의 구현은 약간 "꺼져있다"- 지식이 많은 사람이 이에 대해 논평 할 수 있습니다.

    +0

    이상하게도 이것은 'else'블록 안쪽에 패턴을 넣었을 때 일어난 일이었습니다. 이 함수는 문자열 당 한 번 호출되므로 매번 새로운 정규식을 만들 것이라고 생각합니다. 나는 ** ** 인라인 정규 표현식이 함수 범위 밖으로 이동하여 다시 사용되었다고 추측합니다. 나는 또한'else' 내부에서'pattern'을'new RegExp ("blah")'로 대체함으로써 그것을 해결할 수있었습니다. –

    +0

    이상하게도, 나는 .exec()에 관해서 이것을 몰랐다. 나는 다른 이유로'/ g' 한정자가 필요하다고 가정하고'/your_regex/g.exec('string ')가 아닌''string'.match (/ your_regex/g); '를 할 수 있습니다. – funkwurm

    0

    내 의견을 좀 더 자세히 말하면, matches은 비어 있거나 존재하지 않는다는 것을 의미합니다. 이는 정규식이 일치하지 않는다는 것을 의미합니다. 그러므로 input의 값이이되어야하는지 또는 실제로 정규 표현식의 요구 사항을 준수하지 않는지 확인하는 것이 중요합니다.

    ^http:\/\/(.*\/\d\/.*)_(.*)\/(g\d+p.*)$ 
    

    Regular expression visualization

    Debuggex Demo, 일치하는 텍스트 :

    정규식은 다음을 수행

    http://whatever/3/some_thing/g4p/can be anything 
    ^^^^^^^  ^^^ ^ ^^^^ 
    

    다음 중 하나가 URL에없는 경우에 따라서, 일치하는 것이다 반환 될 수 있습니다 :

      ,210
    • URL은 http://로 시작하지 않는 (예를 들어,하지만, HTTP : //) : 더 _
    • 없다 /
    • /, 숫자, 전혀 발생이 없다
    • , /g, 몇 가지 숫자의 더 발생이 없다 p

    텍스트가 매번 이러한 모든 요구 사항을 충족합니까?

    +0

    나는이 질문에서 내가 분명하다고 생각했지만 반복해라. 모든 행은 괜찮다. 모든 텍스트는 괜찮다. 행 1에 수식을 넣으면 행 1,3,5에 올바른 값이 표시되지만 오류를 표시하려면 2,4,6이됩니다. 행 2에 수식을 넣으면 행 2,4,6이 올바른 결과를 나타내지 만 3,5,7은 잘못된 결과를 표시합니다. 이는 시트에서 실행되는 코드와 관련이 있습니다. 일반 JS의 배열에 대해 동일한 함수를 실행하면 모든 것이 잘 작동합니다. –

    +0

    ... 나는 정규 표현식 시각화를 특히 좋아합니다. 특히 사람들을 가르치는 데 도움이됩니다. 오래 전에 URL을 잃어 버렸습니다. 다시 갖게되어 기쁩니다! 고마워요! –

    +0

    나는 그 예를 읽었지만, 입력이 정규 표현식으로 전달되었을 때 예상했던 것과 어떻게 다른지를 절대적으로 배제하고 싶었다. 죄송합니다. 내 대답이 정규식 지식을 과소 평가했는데 정규식 태그 **에서 많이 발생한다면 ** – funkwurm