2013-07-17 3 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

Также Srik, спасибо вам за исправления :) –

ответ

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

Это сработало очень хорошо. Список создается за считанные секунды. Большое спасибо. –

Смежные вопросы