2014-12-29 2 views
0

До сих пор я работал над одним столбцом VlookUp для данных источника массива.Добавление нескольких столбцов в Google Script Функция Vlookup

Что я сделал для этого, так как я большой объем данных из нескольких листов, я хотел, чтобы это была статическая информация, которую вы искали и помещали в область импорта.

Я могу использовать запрос внутри электронной таблицы, чтобы выполнить то, что хочу, но это BOGS по моей таблице ALOT!

Также на старых листах вы делаете что-то вроде этого: = arrayformula (знак VLookUp (A2: A, Data! A: K, {3,4,7,10} * (строка (A2: A)), false)) для извлечения столбцов C, D, G, J соответствующих критериев строки из колонки A

и в новых листах это невозможно. SAD FACE !!!!

function finderLookUPReturnArray_(Sheet,Range,lookupItem,IndexOffset,IndexOffsetReturn) // finderLookUP(Ref Sheet, Ref Sheet Range, Current lookup Item, Ref Sheet Column for Current lookup Item , Ref Sheet Column for qualified Current lookup Item RETURN) 
{ 
var newArray = new Array(); 
var data = SpreadsheetApp.getActive().getSheetByName(Sheet).getRange(Range).getValues();    //Syncs sheet by name and range into var 
for(var i = 0; i<lookupItem.length; i++) 
{ 
for(nn=0;nn<data.length;nn++) 
{ 
    var Sending = ""; 
if (data[nn][IndexOffset]==lookupItem[i]) 
    { 
    var Sending = data[nn][IndexOffsetReturn]; 
    newArray.push(Sending); 
    break; 
    } 

} 

if(isEmpty_(Sending)==true) 
{ 
    var Sending = "#N/A"; 
    newArray.push(Sending); 
} 
} 
    return newArray; 
} 

//------------------ 

function isEmpty_(string) 
{ 

if(!string)    return true;   
if(string == '')  return true; 
if(string === false) return true; 
if(string === null)  return true; 
if(string == undefined) return true; 
string = string+' '; // check for a bunch of whitespace 
if('' == (string.replace(/^\s\s*/, '').replace(/\s\s*$/, ''))) return true;  
return false;   
} 

Спасибо!

+1

Формулы вы упоминаетесь с печальным лицо должно работать в текущих листах (на самом деле вы можете опустить бит '* SIGN (ROW (A2: A)). – AdamL

ответ

0

@AD: AM Я думал, что требуется *sign(Row(A2:A)), когда используется внутри формуляра array для вызова с несколькими столбцами. Но я просто попробовал это с новым листом, и похоже, что ты прав! И я просто попробовал, но новые листы все еще не поддерживают вызовы Vlookup Multi-Column вне массивов.

См: https://docs.google.com/a/costco.com/spreadsheets/d/1nDOFWeXfeFEGvCjhH0YHunjDuh4atCVMpiEiRV7wAFM/edit#gid=0

Также просто хотел сказать, что я узнал МНОГО от вас, так как я начал в Google приложений мира. Я бы охотился за статьями от вас, потому что знал, что смогу адаптироваться из-за того, насколько ясно это было написано!

Но я не сдавался, и это то, что я придумал.

Обоснование:

1: Сценарий на основе версии из-за больших объемов данных, которые будут ссылаться, чтобы уменьшить последовательные расчеты и замедляя лист.

2: Databasing как importrange с подобными Vlookup свойствами.

Использование:

var LocNum = spreadsheetApp.openById(SheetID).getSheetByName('Sheet1').getRange('J2:J').getValues();

FinderLookUpReturnArrayRange_(LocNum,0,'Data','A:G',[1,3,4,7],'test',1,1);

комплектов в положении 1,1-мишени листа

ИЛИ

FinderLookUpReturnArrayRange_(LocNum,0,'Data','A:G',[1,3,4,7],'test',"Next",1);

Sets на следующей unoc маются строки (базы данных типа) целевого листа

//-------------------------------------------------

function FinderLookUpReturnArrayRange_(Search_Key,SearchKey_Ref_IndexOffSet,Ref_Sheet,Ref_Range,IndexOffSetForReturn,Set_Sheet,Set_PosRow,Set_PosCol) 
{ 
var twoDimensionalArray = []; 
var data = SpreadsheetApp.getActive().getSheetByName(Ref_Sheet).getRange(Ref_Range).getValues();   //Syncs sheet by name and range into var 
for (var i = 0; i<Search_Key.length; i++) // i = number of rows to index and search 
{ 
var Sending = []; 
var newArray = []; 
for (nn=0;nn<data.length;nn++) // nn = number of row data is found at 
{ 
    if (data[nn][SearchKey_Ref_IndexOffSet]==Search_Key[i]) //if statement is triggered when the search_key is found. 
    { 
    for (cc=0;cc<IndexOffSetForReturn.length;cc++) //cc = numbers of columns to ref 
    { 
     var iosr = IndexOffSetForReturn[cc]; 
     var Sending = data[nn][iosr]; 
     if(isEmpty_(Sending)==true) //if statement for if one of the returned cells is blank 
     { 
     var Sending = "#N/A"; 
     } 
     if (IndexOffSetForReturn.length>1) //if statement for multi-Column returns 
     { 
     newArray.push(Sending); 
     if(IndexOffSetForReturn.length-1 == cc) // if statement for pulling all columns into larger array 
     { 
      twoDimensionalArray.push(newArray); 
      break; 
     } 
     } 
     else if (IndexOffSetForReturn.length<=1) //if statement for single-Column returns 
     { 
     twoDimensionalArray.push(Sending); 
     break; 
     } 
    } 
    } 
    if(data.length-1==nn && isEmpty_(Sending)==true) //following if statement is for if the current item in lookup array is not found. Nessessary for data structure. 
    { 
    for(na=0;na<IndexOffSetForReturn.length;na++) //looping for the number of columns to place "#N/A" in to preserve data structure 
    { 
     var Sending = "#N/A"; 
     newArray.push(Sending); 
    } 
    twoDimensionalArray.push(newArray); 
    } 
} 
} 
if(typeof Set_PosRow != "number") 
{ 
var Set_PosRow = getFirstEmptyRowUsingArray_(Set_Sheet); //for usage in a database like entry without having to manually look for the next level. 
} 
for (var l = 0; l < Search_Key.length; l++)         //Builds 2d Looping-Array to allow choosing of columns at a future point 
{ 
if (IndexOffSetForReturn.length<=1) //checks to see if it's a single column return 
{ 
    SpreadsheetApp.getActive().getSheetByName(Set_Sheet).getRange(Set_PosRow + l,Set_PosCol).setValue(twoDimensionalArray[l]); 
} 
} 
if (IndexOffSetForReturn.length>1) //checks to see if it's a multi column return 
{ 
    SpreadsheetApp.getActive().getSheetByName(Set_Sheet).getRange(Set_PosRow,Set_PosCol,twoDimensionalArray.length,twoDimensionalArray[0].length).setValues(twoDimensionalArray); 
} 
} 

//-------------------------------------------------

function isEmpty_(string) 
{ 

if(!string)    return true;   
if(string == '')  return true; 
if(string === false) return true; 
if(string === null)  return true; 
if(string == undefined) return true; 
string = string+' '; // check for a bunch of whitespace 
if('' == (string.replace(/^\s\s*/, '').replace(/\s\s*$/, ''))) return true;  
return false;   
} 

//-------------------------------------------------

function getFirstEmptyRowUsingArray_(sheetname) 
{ 
    var data = SpreadsheetApp.getActive().getSheetByName(sheetname).getDataRange().getValues(); 
    for(var n = data.length ; n<0 ; n--) 
    { 
    if(isEmpty_(data[n][0])=false) 
    { 
     n++; 
     break; 
    } 
    } 
    n++ 
    return (n); 
} 
Смежные вопросы