Я написал небольшой код, чтобы узнать ставки и рассчитать цену. Я написал это в стандартной среде IDE, и он отлично работает:
let rangeAirlines = [
['ICN - BKK', 'Sun May 31 00: 00: 00 GMT + 07: 00 2020', 'KE(express)', 4.55, 3.7, 3.3, 3.25],
['ICN - BKK', 'Sun May 31 00: 00: 00 GMT + 07: 00 2020', 'OZ(express)', 4.4, 4.05, 4.0, 3.95],
['ICN - BKK', 'Sun May 31 00: 00: 00 GMT + 07: 00 2020', 'TG', 3.8, 3.35, 3.3, 3.25]
]
function convertRange (array) {
const airlineObjects = [];
for (let i = 0; i < array.length; i++) {
const [leg, date, airline, rate45, rate100, rate300, rate500] = array[i];
airlineObjects.push({"airline": airline, "rate45Bp": [45, rate45], "rate100Bp": [100, rate100], "rate300Bp": [300, rate300], "rate500Bp": [500, rate500], "validity": new Date(date)});
}
return airlineObjects;
}
function addBreakpoints(airlineData) {
const breakpoints = airlineData;
for (let line of breakpoints) {
line.rate45Bp.push(Math.round(line.rate100Bp[0] * line.rate100Bp[1] / line.rate45Bp[1]));
line.rate100Bp.push(Math.round(line.rate300Bp[0] * line.rate300Bp[1] / line.rate100Bp[1]));
line.rate300Bp.push(Math.round(line.rate500Bp[0] * line.rate500Bp[1] / line.rate300Bp[1]));
}
return breakpoints;
}
function findCarrierObject(bpData, carrier, today) {
//check if today is smaller or equal than validity ? return color green : color red; // add method to set text color.
let carrierObj = {};
for (var line of bpData) {
if (line.airline === carrier) {
return carrierObj = line;
};
}
}
function getRates(obj) {
let rateLines = [];
for (let line in obj) {
Array.isArray(obj[line]) ? rateLines.push(obj[line]) : "error";
}
return rateLines;
};
function calcPriceAir(arr, weight) {
for (let i = 0; i < arr.length; i++) {
const [weightBreak, rate, breakpoint] = arr[i];
if (weight <= weightBreak) {
return weightBreak * rate;
}
if (weight <= breakpoint && breakpoint !== undefined) {
return weight * rate;
}
}
const lastItem = arr[arr.length - 1];
return weight * lastItem[1];
}
function calcPriceAirfreight(range, airline, weight) {
const data = convertRange (range);
const breakpointsObject = addBreakpoints(data);
const carrierObj = findCarrierObject(breakpointsObject, airline);
const rates = getRates(carrierObj);
return calcPriceAir(rates, weight);
}
const price = calcPriceAirfreight(rangeAirlines, "OZ(express)", 540);
console.log(price);
Он предназначен для использования в электронной таблице, вот где он застревает во вспомогательной функции calcPriceAir (). Сообщение об ошибке гласит:
TypeError: Невозможно прочитать свойство '1' из undefined (строка 53, файл «Код»)
Для меня это не имеет смысла.
Существуют ли опытные разработчики сценариев приложений, которые могут определить, где я ошибаюсь?
TL; DR:
- function convertRange (array) => эта функция преобразует диапазон в листах в объект.
- function addBreakpoints (airlinesData) => эта функция добавляет точки останова, используемые в авиалинии, чтобы определить, какой тариф использовать.
- function findCarrierObject (bpData, carrier, today) => эта функция находит допустимый набор ставок, который необходимо использовать.
- function getRates (obj) => эта функция разделяет объект на его голые кости. Возможно, в этом шаге нет необходимости, но я новичок в этом и упростил мне дальнейшую обработку ставок.
- function calcPriceAir (arr, weight) => эта функция вычисляет цену.
- Наконец, пользовательскую функцию я покажу в электронной таблице. Здесь вы добавляете авиакомпанию и свой вес. Он вернет цену. Все перечисленные выше функции будут скрыты.
function convertRange(array) {
const airlineObjects = [];
for (let i = 0; i < array.length; i++) {
const [leg, date, airline, rate45, rate100, rate300, rate500] = array[i];
airlineObjects.push({"airline": airline, "rate45Bp": [45, rate45], "rate100Bp": [100, rate100], "rate300Bp": [300, rate300], "rate500Bp": [500, rate500], "validity": new Date(date)});
}
return airlineObjects;
}
function addBreakpoints(airlineData) {
const breakpoints = airlineData;
for (let line of breakpoints) {
line.rate45Bp.push(Math.round(line.rate100Bp[0] * line.rate100Bp[1] / line.rate45Bp[1]));
line.rate100Bp.push(Math.round(line.rate300Bp[0] * line.rate300Bp[1] / line.rate100Bp[1]));
line.rate300Bp.push(Math.round(line.rate500Bp[0] * line.rate500Bp[1] / line.rate300Bp[1]));
}
return breakpoints;
}
function findCarrierObject(bpData, carrier, today) {
//check if today is smaller or equal than validity ? return color green : color red; // add method to set text color.
let carrierObj = {};
for (var line of bpData) {
if (line.airline === carrier) {
return carrierObj = line;
};
}
}
function getRates(obj) {
let rateLines = [];
for (let line in obj) {
Array.isArray(obj[line]) ? rateLines.push(obj[line]) : "error";
}
return rateLines;
};
function calcPriceAir(arr, weight) {
for (let i = 0; i < arr.length; i++) {
const [weightBreak, rate, breakpoint] = arr[i];
if (weight <= weightBreak) {
return weightBreak * rate;
}
if (weight <= breakpoint && breakpoint !== undefined) {
return weight * rate;
}
}
const lastItem = arr[arr.length - 1];
return weight * lastItem[1];
Logger.log(weight); Logger.log(arr[arr.length-1])
}
function calcPriceAirfreight(airline, weight) {
const ss = SpreadsheetApp.getActive();
const airfreightSheet = ss.getSheetByName("airfreight");
const rangeAirlines =
airfreightSheet.getRange(3,1,airfreightSheet.getLastRow()-2,7).getValues();
const data = convertRange (rangeAirlines);
const breakpointsObject = addBreakpoints(data);
const carrierObj = findCarrierObject(breakpointsObject, airline);
const rates = getRates(carrierObj);
return calcPriceAir(rates, weight);
}
const price = calcPriceAirfreight("OZ(express)", 540);
Logger.log(price);