簡體   English   中英

vanilla js和谷歌應用腳本之間的執行有區別嗎? 相同的代碼在應用程序腳本中呈現錯誤

[英]Is there a difference in execution between vanilla js and google apps script? The same code renders errors in apps script

我編寫了一些代碼來查找費率並計算價格。 我用標准的 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);

它旨在用於電子表格,這就是它卡在幫助程序 function calcPriceAir() 中的地方。 錯誤消息如下:

TypeError:無法讀取未定義的屬性“1”(第 53 行,文件“代碼”)

對我來說完全是無稽之談。

有沒有經驗豐富的應用程序腳本開發人員可以發現我哪里出錯了?

TLDR:

  • function convertRange(array) => 這個 function 將表格中的范圍轉換為 object。
  • function addBreakpoints(airlineData) => 這個 function 添加了航空公司業務中使用的斷點,以確定使用哪個費率。
  • function findCarrierObject(bpData, carrier, today) => this function 找到有效且需要使用的速率集。
  • function getRates(obj) => 這個 function 將 object 剝離到其裸露的骨頭上。 這一步可能不是必需的,但我是新手,這讓我更容易進一步處理費率。
  • function calcPriceAir(arr, weight) => 這個 function 計算價格。
  • 最后,我將在電子表格中展示自定義 function。 在這里,您添加航空公司和您的體重。 它將返回價格。 上述所有功能都將被隱藏。
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);

與在普通 IDE 中執行的操作相比,在 Apps 腳本編輯器中使用 arguments 調用 function 只是略有不同。 簡單console.log(function(arg1, arg2))不起作用。 現在很明顯,但我有一段時間沒有想到,浪費時間尋找不存在的錯誤。

歸根結底,只需要在我的電子表格中調用 function 並傳入兩個 arguments(在我的情況下是兩個單元格引用)。 雖然可能只是我經驗不足。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM