2015-04-02 4 views
0

Я хотел бы «внутреннее соединение» 2 данных-диапазонов (Лист 1 & 2) «ID» и вывод ее результат в листе 3 (как показано ниже)Скрипт Google Apps Внутренней Регистрация Ranges

Для всех листов первая строка - это только заголовок, фактические значения начинаются со второй строки.

Лист 1 - это вся база данных (3000 строк), а лист 2 (1000 строк) - это выбор Листа 1 с дополнительными данными. Каждая запись (ID) присутствует только один раз в каждом листе.

Лист 3 должен показать включать только строки листа 2, но с данными соответствующей строке (по ID) из листа 1.

var sheetOneVals = sheetOne.getDataRange().getValues(); sheetOneVals.splice(0, 1);

var sheetTwoVals = sheetTwo.getDataRange().getValues(); sheetTwoVals.splice(0, 1);

Как это может быть сделано ? https://stackoverflow.com/a/17500836/379777 был почти тем, чего я хотел, за исключением того, что он использует клавиши, которых у меня нет в моем случае.

ЛИСТ 1:

 A   B   C  D 
    ------------------------------------ 
1 | Name | Description | Price | ID | 
    ------------------------------------ 
2 | ABC | Bla1  | 10 | 123 | 
    ------------------------------------ 
3 | DEF | Bla2  | 8  | 234 | 
    ------------------------------------ 
: | : | :   | :  | : | 
: | : | :   | :  | : | 
    ------------------------------------   

ЛИСТ 2:

A  B  C  D   E 
    --------------------------------------- 
1 | ID | Cat1 | Cat2 | Cat3 | Nonsense | 
    --------------------------------------- 
2 | 123 | B | C | D | xyz  | 
    --------------------------------------- 
: | : | : | : | : | :  | 
: | : | : | : | : | :  | 
    --------------------------------------- 

ЛИСТ 3 (желаемый результат):

 A  B  C  D  E   F   G 
    ---------------------------------------------------------- 
1 | ID | Cat1 | Cat2 | Cat3 | Name | Description | Price | 
    ----------------------------------------------------------  
2 | 123 | B | C | D | ABC | Bla1  | 10 | 
    ---------------------------------------------------------- 
: | : | : | : | : | : | :   | :  | 
: | : | : | : | : | : | :   | :  | 
    ---------------------------------------------------------- 

ответ

0

У меня возникло следующее решение. Я, вероятно, недостаточно хорош, чтобы полностью понять ваше решение. Я уверен, что ваше решение намного быстрее.

function createSheet3(){ 
    var ss  = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet1 = ss.getSheetByName("sheet1"); 
    var sheet2 = ss.getSheetByName("sheet2"); 
    var sheet3 = ss.getSheetByName("sheet3"); 

    var sheet3Header = [Name,Description,Price,ID,ID,Cat1,Cat2,Cat3,Nonsense] 

    var sheetOneVals = sheet1.getDataRange().getValues(); 
    sheetOneVals.splice(0, 1); 

    var sheetTwoVals = sheet2.getDataRange().getValues(); 
    sheetTwoVals.splice(0, 1); 

    var consolidatedArr = new Array(); 

    for each (var item in sheetTwoVals){ 
    for (var i in sheetOneVals) { 
    if(item[0] == sheetOneVals[i][3]){ 
     consolidatedArr.push(sheetOneVals[i].concat(item)); 
    } 
    } 
    } 
    sheet3.clear({contentsOnly:true}); 
    sheet3.getRange(1,1,1,9).setValues(sheet3Header); 
    sheet3.getRange(2,1,consolidatedArr.length,9).setValues(consolidatedArr); 


    SpreadsheetApp.flush();       
    Utilities.sleep("200"); 
    if(consolidatedArr.length > 0){ 
    var last = sheet3.getLastRow();      
    var max = sheet3.getMaxRows(); 
    if (last !== max && max-last > 1) {sheet3.deleteRows(last+2,max-last-1);} 
    } 
} 
1

Вы хотите просто логику или кто-то закодировать все это? Логикой, которая будет работать легко и быстро, является:

Начало и объект с ключом в качестве идентификатора.
Итерировать лоток 1 и сохранить все значения как объекты в этих идентификаторах.
Итерационный лоток 2, снова сохраняющий новые ключи, в ID.
Проведите анализ объекта до двойного массива.

Вот некоторые заглушки:

Initiate myObject 
Get Sheet1 and sheet2 
for(lines in sheet 1) 
    myObject[ lineId ] = {} 
    for(cols in sheet 1[lines]) 
     myObject[ lineId ][ columnHeading ] = columnValue 

for(lines in sheet 2) 
    for(cols in sheet 1[lines]) 
    myObject[ lineId ][ columnHeading ] = columnValue 

Вы будете в конечном итоге с duplica ID, в качестве ключа собственности и имущества в нем со значением, но не Бигги.

Initiate arrayToPaste 
Initiate currLine with 0 
for(props in myObject) 
    Initiate first array key as an Array 
    for(keys in myObject[ props ]){ 
    arrayToPaste[ currLine ].push(myObject[ props ][ key ]) 
    } 
    Increase currLine 

Paste arrayToPaste to sheet 

Просто вставьте Heading где-то, может быть в инициализации, после того, как первый для, при вставке, как другой массив, и т.д. ...

И у меня тоже есть вопрос, почему ParseInt ?

+0

Благодарим вас за ответ. Вы правы, parseInt бесполезен. Я удалил его. Однако я не думаю, что ваше решение решает проблему. Я отредактировал текст, и, возможно, теперь яснее, что я хочу. – user3797772

+0

Да, будет.Все значения будут сохранены в объекте с идентификатором в качестве ключа, прямое построение объекта будет выглядеть примерно так: 'myObject = {123: {Cat1: 'B', Cat2: 'C': Cat3: 'D' , Ерунда: 'xyz', Описание: 'Bla1', Price: 10, ID: 123, Name: 'ABC'}, 234 {то же, что и 123 с разными значениями}}; ', это идеально подходит для синтаксического анализа как двойной массив , причем 123 и 234 являются строками (а не литерным номером строки), и каждый ключ в нем находится в столбце. – Kriggs

+0

Логика уже закодирована в связанном s.o. в вопросе. –

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