@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);
}
Формулы вы упоминаетесь с печальным лицо должно работать в текущих листах (на самом деле вы можете опустить бит '* SIGN (ROW (A2: A)). – AdamL