2

Google 스프레드 시트에서 작업 할 간단한 스크립트를 작성하려고합니다. 스프레드 시트는 구글 양식에서 입력을 받아, 따라서이 같은 스프레드 시트에있는 일련의 값이 :Google 스프레드 시트 용 사용자 지정 함수 - 스프레드 시트에서 전달 된 배열 처리

http://i43.tinypic.com/2losg5.jpg

내 목표는 사용자가 각 양식의 입력에서 번호를 제거 할 스크립트를 작성하는 것입니다은 모든 점수를 더하여 하나의 점수를 제공하십시오. 예를 들어, 사용자가 셀에 =sumColumns(H2:K2)을 입력하면 점수의 합계가 반환됩니다 (내가 게시 한 샘플 스크린 샷의 경우 3+3+0+3, 9의 결과가 반환 됨).

function sumColumns(values) { 
    var sum = 0; 
    for(var i = 0; i <= values.length; i++){ 
    var input = values[0][i]; 
    var x = input.toString(); 
    var y = x.charAt(0); 
    var num = parseInt(y); 
    sum += num; 
    } 
    return sum; 
} 

문제는 오직 두 개의 값을 추가하는 것이다 : 여기

내가이 일을 쓴 코드입니다. 따라서 =sumColumns(H2:K2)을 스프레드 시트의 셀에 넣으면 6 만 반환됩니다. 또한 3 호선에서 i <= values.length에서 i < values.length으로 변경하면 하나의 숫자 만 추가되므로 결과적으로 3이 표시됩니다. 내 생각 엔 Google Spreadsheet 값이 함수에 전달되는 방식을 오해하고 있지만 완전히 작동하지 못했습니다. 나는 정말 어떤 도움을 주셔서 감사합니다!

답변

0

기울임 꼴


댓글 ... 내가 그들을 사용하지 않기 때문에 나는 사용자 정의 기능을 가진 좋은 아니에요하지만 values 정말 배열이 아닌 것 같습니다 :

흠 당황 .. 내 첫 번째하지만 그것은 2D 배열해야했다하지만 내 테스트 val [0] 기록 된 및 '정의되지 않은'오류를 반환 ... 나는 그 순간에 뭔가 잘못 입력해야합니다 ... 어쨌든, 그 이유는 데이터를 문자열로 처리하고 split과 regex를 사용하는 방법을 모색했습니다. Mogsdad의 답과 평소와 같이 대답과 그에 대한 모든 설명이 있으며 ;-) 자주 그와 마찬가지로 내 문제보다 나은 대답을 얻을 수 있습니다. (@Mogsdad) 하나의 제한은 비 정수 값에 대한 주석을 코드에도 적용 할 수 있습니다 ... parseInt()를 사용하여 십진수를 제거하면됩니다. :-) 그렇다면 사용 사례 이 예제의 한계에서 두 코드 모두 예상대로 작동해야하며, Mogsdad는 더 학문적이며 프로그램 적으로 정확합니다.

끝.


는 모든 입력 범위 (1 이상의 행과 열)에 대해 예상대로 작동 미만이 트릭 사용 : I은 또한 번호 추출 모드 변경

function sumCol(val) { // returns the sum of all numeric values in range 
    var values = val.toString().split(','); 
    var sum = 0; 
    for(var n=0;n<values.length;++n){ 
    sum+=Number(values[n].replace(/[^0-9+.]/ig,'')); 
    } 
    return sum; 
} 

가 더 보편적 있도록.

3

죄송합니다. 편집 됨 & 질문을 저장하고 답변을 작성했습니다. 저장하지 않았습니다. 나는 Serge가 그것에 나를 때리게했다! 그리고 평소와 같이 Serge의 대답은 잘 작동합니다 (정수 값 포함). 하지만 당신은 일이 어떻게 돌아 갔는지 물어 보았습니다. 그래서 여기에갑니다.

범위로 매개 변수로 범위를 지정하면 H2:K2이 경우이 함수는 반환 값이 Range.getValues() 인 것과 같은 2 차원 배열을받습니다.

[["3 (Rarely)","3 (Frequently)","0 (Never)","3 (Frequently)"]] 

입니다 : 여기

function sumColumns(values) { 
    return JSON.stringify(values); // For debugging, just return string showing values 
    ... 

당신이 =sumColumns(H2:K2)가 포함 된 셀에서 볼 수있는 내용은 다음과 같습니다 당신은 매개 변수의 JSON 표현을 반환하는 함수를 변경 (일시적으로)에 의해, 쉽게 테스트 할 수 있습니다 [ .. ]으로 묶인 배열과 내부에 다른 배열이 있고 대괄호로 묶인 배열을 보여 주며이 배열에는 네 개의 요소가 있습니다. 우리가 대신 H2:K3을 할 범위를 변경하는 경우 (공백 명확성을 위해 추가로), 우리는이를 얻을 :

[ 
    ["3 (Rarely)","3 (Frequently)","0 (Never)","3 (Frequently)"], 
    ["","","",""] 
] 

을 이제 당신이 당신의 함수가했던 결과를 제공하는 이유를 쉽게 알 수 있음을 알 수있다.

첫째, for(var i = 0; i <= values.length; i++)는이 values에 얼마나 많은 행 알려 것 values.length 때문에, 돌이에 잘못된 배열 범위를 사용하고 있습니다. H2:K2에서 길이는 1입니다. 대신 첫 번째 행 (values[0])의 열을 반복하고 그 셀은 4이어야합니다.

당신이 루프에 대한 <<= 대를 궁금해 - 우리는 0부터 시작하는 인덱스, 그리고 .length 요소의 수를 반환 이후 <를 사용할 필요가 없습니다.

parseInt()를 사용
for (var i=0; i < values[0].length; i++){ ... } 

가 좋은 선택이며, 스프레드 시트의 값에 적합합니다 : 그래서 우리와 끝까지. 그러나 어떤 문자열 값이 숫자가 아닌 값으로 시작하는 문자열을 먼저 제거하도록하면 - parseInt() 문자열에서 Integer를 찾을 수 있습니다.

function sumColumns(values) { 
    return JSON.stringify(values); // For debugging, just return string showing values 
    var sum = 0; 
    for(var i = 0; i < values[0].length; i++){ 
    var input = new String(values[0][i]) 
       .replace(/^\D+/g, ''); // Strip any leading non-digits 
    sum += parseInt(input); 
    } 
    return sum; 
}