2013-07-11 2 views
0

Я написал сценарий для периодической копирования данных из одного столбца в зависимости от того, была ли определена каждая ячейка с текущими данными (обозначена как ALIVE в другом столбце) и поместить эти данные в другой столбец на другом листе. Сценарий не превышает время выполнения, однако мне было интересно, есть ли способ сделать это быстрее, используя Массивы.Сокращение времени выполнения скриптов Google Apps с использованием массива?

Я ценю помощь, я новичок в программировании на Google Apps Script, но подключаюсь. Большое спасибо заранее за совет.

function copyFunctionDATA() { 

    var defSheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("(DATA)") 
    var defSheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("(DATAdead)") 
    var numLastRow = 60 

for (var x=11; x<=numLastRow; x++) { 

    var srcRange = defSheet1.getRange(x,1); 
    var srcRange2 = defSheet1.getRange(x,1); 
    var value = srcRange.getValue(); 
    var value2 = srcRange2.getValue(); 

if (value2.indexOf("ALIVE") !== -1) { 
    defSheet2.getRange(x,1).setValue(value); 
    } 
}} 

ответ

1

Транспонирование в 2D-массиве очень просто. Основное различие заключается в том, как индексируются данные: количество диапазонов от 1 и количество массивов от 0.

Итак, чтобы транспонировать код, вы должны получить 2 массива (по одному на каждый лист) и перебрать соответствующие ячейки, изменить значение в зависимости от в вашем состоянии и запишите массив в электронную таблицу, чтобы обновить его.

Вот грубый транспонированная кода с несколькими комментариями, чтобы объяснить: (некоторые переменные должны быть переименованы для ясности)

function copyFunctionDATA() { 

    var defSheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("(DATA)").getDataRange().getValues();// read the whole sheet in a 2D array 
    var defSheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("(DATAdead)").getDataRange().getValues();// read the whole sheet in a 2D array 
    var numLastRow = 59 ; // I suppose you intentionally limit to the 60 first rows ? 

for (var x=10; x<=numLastRow; x++) { // starting from row 11 >> becomes 10 


    var value = defSheet1[x][0]; 
    var value2 = defSheet1[x][0]; // you made a mistake in your code : you define 2 identical ranges !! change it to your need : 0 is column A, 1 is B etc... 

if (value2.indexOf("ALIVE") !== -1) { 
    defSheet2[x][0] = defSheet1[x][0]; 
    } 
} 
    SpreadsheetApp.getActiveSpreadsheet().getSheetByName("(DATAdead)").getRange(1,1,defSheet2.length,defSheet2[0].length).setValues(defSheet2);// write back defSheet2 array to sheet (DATAdead) 
} 

EDIT: если вы хотите, чтобы перезаписать только первый столбец в defSheet2 меняет просто определение диапазона для этого листа, например, например:

var defSheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("(DATAdead)").getRange('A1:A').getValues();// read the whole sheet in a 2D array 
+0

Серж, большое спасибо за код и пояснения ... это ценно, потому что концепция теперь имеет смысл, и я могу следовать логически. Да, я допустил ошибку в коде, в этом случае должен был быть столбец AN или 39. При запуске скрипта я получаю «TypeError: невозможно прочитать свойство« 0 »из неопределенного.» Строка 11. Я пытаюсь решить ее сам, прежде чем возвращаться, чтобы спросить, но она застревает в defSheet1 [x] [0]. Всего наилучшего. – HoosierTIM

+0

Oooops извините, я забыл добавить'.getValues ​​() 'в конце 2 строки ... (они там, где так долго, что я его не видел ;-) код обновлен (см. DefSheet 1 и 2) –

+0

Serge , большое спасибо ... работает красиво. Я не думал возвращаться к defSheet 1 и 2. Дело только в том, что он записывает данные в DATAdead на все столбцы, а не только на колонку A. Это, как говорится, я должен уметь это понять, и я в вашем долге. Всего наилучшего. – HoosierTIM

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