2014-07-21 13 views
1

Google 시트 내의 범위에서 여러 기준을 식별하려고합니다. 값을 확인하면 스크립트는 값이있는 열을 나에게 반환하고 열을 삭제하는 함수를 호출해야합니다. 아래에 제가 함께 작성한 코드가 있지만 문제가 있습니다.셀 값을 기준으로 열을 삭제하십시오.

삭제하는 동안 범위 초과 오류가 발생합니다.

//Delete Column 
function deleteColumn(col) { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getActiveSheet(); 
    var numCol = sheet.getRange("A1:T23").getNumColumns(); 
    var data = sheet.deleteColumn(col); 

    for (var i = numCol; i >= 0; i--) { 
    var remove = data; 
    Logger.log(remove + " was removed"); 
    } 
} 

//find columns 
function findColumn() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getActiveSheet(); 
    var data = sheet.getRange("A1:T23"); 
    var values = data.getValues(); 

    for (var i = 1; i < values.length; i++) { 
    for (var j = 0; j < values[i].length; j++) { 
     if (values[i][j] == "Notes" || values[i][j] == "Billable" || values[i][j] == "Total") { 
     var col = j+1; 
     Logger.log("columns numbers found" + col); 
     deleteColumn(col); 
     } 
    } 
    } 
} 

필자가 생각하지 못하는 부분은 열이 삭제되기 시작했을 때입니다. 이것은 효과적으로 열의 수를 변경하므로 열의 수에서 시작하여 뒤로 (오른쪽에서 왼쪽으로) 시도하고 있습니다. 0..values.length-1에서 그것을 인덱스를 의미하는 values 배열은 0을 기반으로

(var i = 1; i < values.length; i++) 

:

+0

나는 그 과정에서 범위를 변경하려고 했으므로 ... 그것이 정적 범위 A1 : T23을 설정했기 때문인 것으로 생각됩니다. 일단 첫 번째 열을 삭제하면 아마도이 범위는 존재하지 않을 것입니다. 동적으로 설정된 범위를 사용해보십시오. – andrewbuilder

+0

원래는 sheet.getDataRange()를 사용하여 동적 범위를 시도했습니다. 그러나 여러 번 열을 식별하기 위해 다른 문제와 함께 여전히 같은 문제를 겪고있었습니다. – jjones312

답변

1

경계 오류의 아웃 때문에 여기 루프 범위이다.

진술 중 일부는 개체 유형이 혼합되어 있습니다. 항상 이것을 다시 확인하십시오.

var data = sheet.deleteColumn(col); 

당신은 deleteColumn()Sheet 반환하는 것을 볼 수 있습니다 - 당신이 이미 가지고 같은 시트를. 이것은 체인에 대해 수행되며, 하나의 명령문에서 시트에 대해 여러 작업을 수행 할 수 있습니다. 변수 이름이 삭제 된 열의 사본을받을 것으로 예상하고 log() 호출이 표시하려고하면 ... 그 때문에 로그에 [object]이 표시 될 가능성이 큽니다.

행이나 열을 제거 할 때 카운트 다운하는 것이 옳습니다. 그것은 당신이 모든 적당한 장소에서 그것을하지 않았던 것처럼 보입니다. findColumn() 호출 함수는 호출음 (deleteColumn())이 루프를 처리하는 동안 (콜럼이 삭제됨에 따라 동기화되지 않는) 증가하는 루프를 가지고 있습니다 (아마 전혀 필요하지 않음). 어쨌든 deleteColumn()이 존재합니까? 그것이 의도 한 것처럼 보이면 모든 데이터가 삭제됩니다.

마지막으로 열을 삭제하기 때문에 바깥 쪽 루프로 열을 반복해야합니다. 행 삭제의 조건이 충족 될 경우 행에 대한 내부 루프는 continue d (종료) 일 수 있습니다. 내부 루프가 있다는 것을 의미합니까? 그것은 모든 행에있는 세 가지 값을 찾습니다. 헤더 만보고 싶다면 행 1 (배열의 인덱스 0)입니다.

function deleteNBTColumns() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getActiveSheet(); 
    var dataRange = sheet.getRange("A1:T23"); 
    var data = sheet.getRange("A1:T23"); 
    var values = data.getValues(); 
    var numRows = values.length; 
    var numCols = values[0].length; 

    for (var col = numCols-1; col > 0; col--) { // count down over columns 
    for (var row = 0; row < numRows; row++) { // count up over rows 
     switch (values[row][col]) {    // examine cell contents 
     case "Notes": 
     case "Billable": 
     case "Total":       // in these cases... 
      sheet.deleteColumn(col+1);   // delete column in sheet (1-based) 
      continue;        // continue with next column 
      break;        // can't get here, but good practice 
     } 
    } 
    } 
} 
+0

deleteColumn()은 오른쪽에서 왼쪽으로 삭제한다고 가정했으나 거의 모든 열을 삭제했지만 오류가 발생합니다. 위대한 설명과 의견. 논리를 이해하는 데있어 차별화 된 세상을 만들었습니다. – jjones312

관련 문제