2013-07-17 65 views
0

我正在嘗試製作一個腳本,它將從電子表格與供應商列表中創建一個表格。電子表格有超過一千個條目,所以我的腳本處理速度非常慢。下面是代碼對大型電子表格中的數據進行分類

function SupplerAnalysis() { 
//Importing data 
var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var sheet = SpreadsheetApp.getActiveSheet(); 
var data = sheet.getDataRange().getValues(); 

//Creating a sheet 
if (ss.getSheetByName("Analysis") !=null) { 
//Logger.log('exists'); 
} else { 
//Logger.log('Creating new'); 
    ss.insertSheet("Analysis"); 
} 
var sheetNumber = ss.getSheetByName("Analysis").getIndex() - 1; 
ss.getSheetByName("Analysis").clear(); 
var newsheet = ss.getSheets()[sheetNumber]; 
var newdata = newsheet.getDataRange().getValues(); 

newsheet.getRange(1, 1).setValue('Suppliers'); 

//Get list of suppliers 
for (var s = 1; s < data.length; s++) { 
var supplier = data[s][3]; 
var z = 1; 
newdata = newsheet.getDataRange().getValues(); 
    for (var r = 1; r < newdata.length;r++) { 
     if (supplier === newdata[r][0]) { 
      z = 2; 
     } else { Logger.log(r);} 
    } 
    if (z === 1) { 
     newsheet.getRange(r+1, 1).setValue(supplier); 
    } else if (z > 1) { Logge.log('Error'); 
    } 
    } 

列數據[S] [3]是供應商不同作業的列表。有超過一千個參賽作品,共有約160家供應商。該腳本需要大約5分鐘才能執行,這非常緩慢且無效。

如何更改代碼以加快此過程? 有沒有什麼辦法可以將NewCategoryFilter的輸出放入表中?

+0

要標記帖子已解決,您必須簡單地「接受」,它將向答覆者授予15個代表。編輯標題並不是這個平臺上的常用用法。 –

+0

謝謝。對不起,我是新來的:) –

+0

同樣也是斯里蘭卡,感謝你也要更正:) –

回答

1

只是不調用API中循環:

function SupplerAnalysis() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var data = sheet.getDataRange().getValues(); 
    var newsheet; 

    if ((newsheet=ss.getSheetByName("Analysis")) == null) 
    newsheet = ss.insertSheet("Analysis"); 
    else newsheet.clear(); 

    var supplierList = [['Suppliers']]; 

    for (var s = 1; s < data.length; s++) { 
    for (var r = 1; r < supplierList.length; r++) 
     if (data[s][3] == supplierList[r][0]) break; 
    if (r == supplierList.length) supplierList.push([data[s][3]]); 
    } 

    newsheet.getRange(1,1,supplierList.length,1).setValues(supplierList); 
} 

睜大你的眼睛上的錯別字 - 我只是在輸入這個

在轉換對象鍵的供應商可能是作爲供應商有點冒險。名稱可能不是合法的對象鍵。

+0

哇,非常感謝。太棒了。對象鍵也起作用,但如果你說它有風險,我會使用它。非常感謝您的幫助。 –

0

擺脫循環中對newsheet.getDataRange的調用可能會加快速度。您可以通過將值存儲爲對象{}鍵並使用「in」運算符來查看它們是否存在,從而更快地檢查重複項。例如

var set = {}; 
vals.forEach(function(value){ 
    if(value in set) { 
     console.log('duplicate found'); 
    } 
    set[value] = true; 
}); 

我不確定NewCategoryFilter是什麼。

+0

「擺脫循環內對newsheet.getDataRange的調用可能會加快速度。」 我知道,但沒有它在「for(var r = 1; r

+0

這工作得很好。該列表在幾秒鐘內生成。非常感謝。 –

相關問題