2014-04-07 4 views
0

시트의 한 열을 반복하는 스크립트를 작성하고 셀 값을 다른 셀과 비교 한 다음 동일한 경우 배경색을 변경하려고합니다.Google 스프레드 시트의 셀 참조가 범위를 벗어났습니다.

저는 JS와 Google 스크립팅에 새로운 것이므로 항상 "셀 참조 범위를 벗어남"오류가 발생하므로 for 루프에 문제가 있습니다. 지금까지 내 코드는 다음과 같습니다.

function onOpen() 
{ 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName("Exibicao"); 

    var range = sheet.getDataRange(); 
    var rows = range.getNumRows(); 

    for(var i = 0; i <= rows; i++) 
    { 
    var cell = range.getCell(i, 13); 

    var option1 = cell.offset(0, -3); 
    var option2 = cell.offset(0, -2); 
    var option3 = cell.offset(0, -1); 

    if(option1.getValue() == cell.getValue()){ 
     option1.setBackground("#b6d7a8"); 
    }else if(option2.getValue() == cell.getValue()){ 
     option2.setBackground("#b6d7a8"); 
    }else if(option3.getValue() == cell.getValue()){ 
     option3.setBackground("#b6d7a8"); 
    } 
    } 
} 

답변

1

어떤 오류가 발생합니까? 각 줄 다음에 셀 위치를 로깅하면 범위를 벗어난 위치를 더 잘 파악할 수 있습니다.

두 번째 모습에
var cell = range.getCell(i, 13); 
Logger.log(cell.getA1Notation()); 

var option1 = cell.offset(0, -3); 
Logger.log(option1.getA1Notation()); 

는 ...이 같은 몇 가지 일을해야합니다 생각

function onOpen() 
{ 

    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName("Exibicao"); 

    var range = sheet.getDataRange(); 
    var rows = range.getNumRows(); 

    // Get values all at once 
    var values = range.getValues(); 
    var row, len, bgs = [], rowBg = []; 

    for(row = 0, len = values.length; row < len; row++) { 
    var cell = values[row][12]; 
    var option1 = values[row][9]; 
    var option2 = values[row][10]; 
    var option3 = values[row][11]; 

    rowBg = ['white', 'white', 'white']; 
    if(option1 == cell){ 
     rowBg[0] = "#b6d7a8"; 
    }else if(option2 == cell){ 
     rowBg[1] = "#b6d7a8"; 
    }else if(option3 == cell){ 
     rowBg[2] = "#b6d7a8"; 
    } 

    bgs.push(rowBg); 
    } 
    //Logger.log(bgs) 
    // Set background colors all at once, start at the top left 
    sheet.getRange(1, 10).offset(0, 0, bgs.length, bgs[0].length).setBackgrounds(bgs); 
} 
+3

글쎄,'getCell()'의 맥락에서, 인자는 하나의 것을 기반으로한다. 나는 에러가 발생한 곳이라고 생각한다. 따라서 for (var i = 1; i <= rows; i ++)를 사용해야합니다. 더 큰 그림에서 (Bryan이 동의 할 것이라고 확신 하긴하지만) 루프 내에서 이러한 모든 작업을 수행하는 것은 실제로 그것에 대한 올바른 방법이 아닙니다. – AdamL

+0

죄송합니다, 오류가'var cell = range.getCell (i, 13); '에 있습니다. 그러나 AdamL이 말했듯이'i = 1'로 변경하면 효과가있었습니다. 루프 내부로 들어가는 것에 관해서는 어떤 제안이 있습니까? – Jorgel

+0

예, 제안 사항에 추가되었습니다. 그것이 의미가 있는지보십시오. 확실히 더 효율적으로 아담이 벗어난 것처럼. 스프레드 시트의 새로운 기본 제공 조건부 서식은 지금이 작업을 수행 할 수 있음을 알고 있습니다. –

1

내가 틀릴 수도 있지만, 내가 문제가 루프의 선언에 내기 것이다 :

for(var i = 0; i <= rows; i++) 

스크립트 어레이 2의 길이 배열 arrayName[0]에서의 첫번째 요소를 가지며에서 마지막 요소 즉,이다 .

루프는 i = 0으로 시작하고 i = range.getNumRows()으로 끝납니다. 즉, 배열은 first 요소에서 시작하여 배열에있는 것보다 하나 더 많은 행을 가져 오는 것으로 끝납니다. arrayName[length - 1] 대신 arrayName[length]으로 끝납니다.

for(var i = 0; i < rows; i++) 

을 그리고 문제가 해결되지 않을 경우,이 시도 :

이 시도 이러한 액세스 getNumRows() 요소의

for(var i = 1; i <= rows; i++) 

두,하지 getNumRows() + 1 요소를.

행운을 빈다.

관련 문제