Я работаю над пользовательской функцией, которая конвертирует единицы измерения.
Должно выглядеть определить ячейку в A1 и использовать ее в качестве ключа поиска в первой строке другой вкладки. Как только он находит ячейку, соответствующую A1 на предыдущей вкладке, он записывает это число в качестве индекса, возвращаемого для функции 'vlookup'
https://docs.google.com/spreadsheets/d/1DgdggqfKRiuKsJWYSiMKl57ZkpuCZDWxyZKV7T2zzHU/edit?usp=sharing
function uConvert( quantity, sourceUnit, targetUnit )
{
var accountName = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(1,1).getValue(); //determine the account name to use in the horizontal search
var spreadsheet = SpreadsheetApp.getActive();
var tableSheet = spreadsheet.getSheetByName("Productivity Standards");
var tableData = tableSheet.getDataRange().getValues();
var numColumns = tableSheet.getLastColumn();
var sourceSpot = 0;
var targetSpot = 0;
// searches across row 1 to find which column to perform the multiplication/division
for (var accountSpot = 0; accountSpot<numColumns; ++accountSpot){
if (tableData[0][accountSpot]==accountName){break};
}
for ( var tableIndex = 0; tableIndex < tableData.length; ++tableIndex )
{
var unit = tableData[tableIndex][0];
if ( unit == sourceUnit )
{
sourceSpot = tableIndex;
}
if ( unit == targetUnit )
{
targetSpot = tableIndex;
}
}
if ( sourceSpot == 0 || targetSpot == 0 )
{
return "One or more units not in table";
}
var convertedAmount = 0;
if ( sourceSpot > targetSpot )
{
convertedAmount = convertHigherToLower( tableData, sourceSpot, targetSpot, quantity, accountSpot );
}
else if ( sourceSpot < targetSpot )
{
convertedAmount = convertLowerToHigher( tableData, sourceSpot, targetSpot, quantity, accountSpot );
}
else
{
return quantity;
}
return convertedAmount;
}
function convertHigherToLower( data, startIndex, endIndex, startingAmount, columnToSearch )
{
// we're decending so we're multiplying
// ( 3 pallets x 20 cartons per pallet x 30 pieces per carton = 1800 )
var convertedQuantity = startingAmount;
for ( var dataIndex = startIndex; dataIndex > endIndex; --dataIndex )
{
convertedQuantity *= data[dataIndex][columnToSearch];
}
return convertedQuantity;
}
function convertLowerToHigher( data, startIndex, endIndex, startingAmount, columnToSearch )
{
// we're ascending so we're dividing
// Assume:
// 300 pieces is 10 cartons is 0.5 pallets
// this will be a ratio
// the ratio will be starting amount ( 300 ) divided by the
// remainder of the conversion amounts of the table
// starting from the next higher thing on the table ( startIndex + 1 )
// to the end of table
// 300 / 20 / 30
// 15 / 30
// equals 0.5
var conversionAmount = startingAmount;
for ( var dataIndex = startIndex + 1; dataIndex <= endIndex; ++dataIndex )
{
conversionAmount /= data[dataIndex][columnToSearch];
}
return conversionAmount;
}
В примере
NUM!
Ошибка: числовое значение больше 1.79769E + 308 и не может отображаться правильно.