2017-05-07 1 views
0

여러 행과 열이있는 스프레드 시트가 있습니다. 두 개의 열 (열 3 & 4)은 텍스트로 채워집니다. 이 두 열의 텍스트를 지우고 모든 특정 문자 (줄 바꿈, 쉼표, 느낌표, 따옴표 등)를 삭제하고 싶습니다. 그래서 다음 스크립트를 작성했습니다 :한 열에서 다른 열로 데이터를 전달하는 방법은 무엇입니까?

function testwoD() { 
    var input = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Raw_data"); 
    var output = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Raw_data"); 
    var row_count = input.getLastRow() 
    var col_count = input.getLastColumn(); 

    raw_data = input.getRange(1, 1,row_count,col_count).getValues() 

    temp3 = [] 
    for (var i = 0; i < row_count; i++) { 
     var punctRE = /[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,\-.\/:;<=>[email protected]\[\]^_`{|}~\r\n|\n|\r]/g; 
     var spaceRE = /\s+/g; 
     temp3.push(raw_data[i][4].toString().replace(punctRE, '').replace(spaceRE, ' ')); 
    } 

    temp4 = [] 
    for (var i = 0; i < row_count; i++) { 
     var punctRE = /[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,\-.\/:;<=>[email protected]\[\]^_`{|}~\r\n|\n|\r]/g; 
     var spaceRE = /\s+/g; 
     temp4.push(raw_data[i][3].toString().replace(punctRE, '').replace(spaceRE, ' ')); 
    } 


    var toAddArray3 = []; 
    for (i = 0; i < temp3.length; ++i){ 
     toAddArray3.push([temp3[i]]); 
    } 

    var toAddArray4 = []; 
    for (i = 0; i < temp4.length; ++i){ 
     toAddArray4.push([temp4[i]]); 
    } 

    output.getRange(1, col_count-13,row_count,1).setValues(toAddArray3); 
    output.getRange(1, col_count-14,row_count,1).setValues(toAddArray4); 
    } 

그것은 작동하지만 매우 복잡하고 혼란 스럽습니다. 나는 그것을 단계적으로 만들었고, 심지어 나 자신조차도 실제로 그것을 설명하는 데 어려움을 겪었다.

크게 개선 할 수있는 방법이 있습니까?

최고,

사이먼.

+1

정규식의 경우 영숫자와 특수 문자가 아닌 '[^ a-zA-Z0-9 \ s] 대신 사용할 수 있습니다. 이것은 목록에없는 문자와 일치합니다. 코드를 더 쉽게 이해할 수 있습니다. –

답변

1

DRY! - 너 자신을 반복하지 마라.

또 다른 인기있는 관용구는 UMNF 여야합니다.

모든 것을 자신의 기능에 넣으면 기능을 캡슐화하고 색인 및 하위 스크립트를 부기하기보다는 각 레벨의 데이터로 수행하려는 작업에 중점을 둡니다.

function cleanColumns() { 
    var input = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); 
    var output = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); 
    var raw_data = input.getDataRange().getValues(); 
    var columnsToClean = [3,4]; 

    function cleanText(t) { 
    var punctRE = /[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,\-.\/:;<=>[email protected]\[\]^_`{|}~\r\n|\n|\r]/g; 
    var spaceRE = /\s+/g; 
    return t.toString().replace(punctRE, "").replace(spaceRE, " "); 
    }; 

    function cleanColumn(col) { 
    return raw_data 
     .map(function(row) {return row[col];}) 
     .map(cleanText) 
     .map(function(row) {return [row];}) 
    }; 

    function cleanAndWrite(col) { 
    var data = cleanColumn(col); 
    output.getRange(1, col + 1, data.length, 1).setValues(data); 
    } 

    columnsToClean.forEach(cleanAndWrite); 
} 
+0

좋아, 정말 고마워. 그것이 어떻게 작동하는지 더 자세히 설명해 줄 수 있습니까? 놀랄 것입니다! :피 –

관련 문제