2017-05-07 9 views
0

私は複数の行と列を持つスプレッドシートを持っています。 2つの列(列3 & 4)がテキストで埋められています。私はこの2つの列からテキストを消去し、すべての特定の文字(改行、カンマ、感嘆符、引用符など)を削除します。だから私は次のスクリプトを書いた:ある列から別の列にデータを渡す方法はありますか?

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

これは完璧に感謝しています。どのように正確に動作するかについてもう少し説明していただけますか?素晴らしいだろう! :p –

関連する問題