2016-04-03 107 views
0

我試圖讓這個函數在電子表格上運行,並找到並替換所有的撇號。現在它可以工作,但它需要很長時間,現在在我的電子表格中,我有12行,只需要128秒就可以運行。我想嘗試做的事情只能在電子表格的最後一行激活。查找並替換Google電子表格的最後一行

我試圖通過添加var row = r.getLastRow();並更改幾個點來使用行來工作。當我這樣做時,我無法讓它運行。每次提交表單時我都會運行它,所以它應該始終是最後一行。

我得到了代碼:https://productforums.google.com/d/msg/docs/7IlOotksJ4I/liXa0SrC-R4J

function fandr() { 
    var r=SpreadsheetApp.getActiveSheet().getDataRange(); 
    var rws=r.getNumRows(); 
    var cls=r.getNumColumns(); 
    var i,j,a,find,repl; 
    find="'"; 
    repl=""; 
    for (i=1;i<=rws;i++) { 
    for (j=1;j<=cls;j++) { 
     a=r.getCell(i, j).getValue(); 
     if (r.getCell(i,j).getFormula()) {continue;} 
     try { 
     a=a.replace(find,repl); 
     r.getCell(i, j).setValue(a); 
     } 
     catch (err) {continue;} 
    } 
    } 
} 

回答

1

在我看來,用腳本替換文本的最佳方式是使用map。此功能由@ serge-insas here提供。你可以修改它以獲得最佳的性能結果,並只替換最後一行值:

function testReplaceInRange(){ 
    var sheet = SpreadsheetApp.getActiveSheet() 
    var lastRow = sheet.getLastRow(); 
    var DataRange = sheet.getDataRange(); 

    var range = DataRange.offset(lastRow - 1, 0, 1); // last Data row 

    replaceInRange(range,"'",""); 
} 


function replaceInRange(range, to_replace, replace_with) { 
    //get the current data range values as an array 
    var values = range.getValues(); 

    // make RegExp 
    var Rep = new RegExp(to_replace, 'g'); 
    //loop over the rows in the array 
    for(var row in values){ 

    //use Array.map to execute a replace call on each of the cells in the row. 
    var replaced_values = values[row].map(function(original_value){ 
     return original_value.toString().replace(Rep,replace_with); 
    }); 

    //replace the original row values with the replaced values 
    values[row] = replaced_values; 
    } 

    //write the updated values to the range 
    range.setValues(values); 
} 

我也用正則表達式,通過@科瑞毛here建議trich。它的目的是推翻所有出現的to_replace文本,而不僅僅是第一個。

+0

謝謝!迄今爲止完美的工作。這比其他功能運行得更快。它在0.5秒內完成!我嘗試過首先使用Google表單數據驗證,但似乎有些破裂。 – maxlowry123

相關問題