Есть ли разница в исполнении скрипта vanilla js и приложения google? Тот же код отображает ошибки в скрипте приложений - PullRequest
0 голосов
/ 21 июня 2020

Я написал небольшой код, чтобы узнать ставки и рассчитать цену. Я написал это в стандартной среде 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);

1 Ответ

0 голосов
/ 21 июня 2020

Вызов функции с аргументами в редакторе скриптов приложений немного отличается от того, что вы делали бы в обычной среде IDE. Просто console.log(function(arg1, arg2)) не работает. Сейчас это довольно очевидно, но какое-то время мне не приходило в голову, тратить время на поиски ошибки, которой не было. переданы два аргумента (в моем случае две ссылки на ячейки). Хотя, может быть, я просто неопытен.

...