如果UrlFetchApp出错,muteHttpExceptions跳转到第86行。

问题描述 投票:0回答:1

我希望当出现错误时,脚本能从第86行继续。但当我试图保存脚本时,它说因为声明前有";",所以失败了。我到底忘了什么?


function onOpen( ){
  // This line calls the SpreadsheetApp and gets its UI   
  // Or DocumentApp or FormApp.
  var ui = SpreadsheetApp.getUi();

  //These lines create the menu items and 
  // tie them to functions we will write in Apps Script

  ui.createMenu('Atualizar Clima')
  .addItem('Ativar', 'TudoCompleto')
  .addToUi();
}

function TudoCompleto() {
  var spreadsheet = SpreadsheetApp.getActive();

  //Clima
  spreadsheet.getRange('Monster!A1').activate();
  spreadsheet.getCurrentCell().setFormula('=IMPORTXML(\'Clima\'!F20,"//*[@id=\'page_team_1_block_venue_info_3\']/div/div[1]/dl/dt")');
  spreadsheet.getRange('Clima!F21:F45').activate();
  spreadsheet.getRange('Monster!A1:A25').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);

  //Clima 2
  spreadsheet.getRange('Monster!A1').activate();
  spreadsheet.getCurrentCell().setFormula('=IMPORTXML(\'Clima\'!F20,"//*[@id=\'page_team_1_block_venue_info_3\']/div/div[1]/dl/dd")');
  spreadsheet.getRange('Clima!G21:G44').activate();
  spreadsheet.getRange('Monster!A1:A24').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);

  //CLIMA  
  spreadsheet.getRange('Clima!A3:B8').activate();
  spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});

  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getSheetByName("Clima");
  var apiKey = "c9e1e7816ecc0e8eaeda584109d342bf"; // Or you can try my key

  var cityName = sheet.getRange("A1").getValue();
  // Go to https://openweathermap.org, register and get a free API key
  var apiCall = "api.openweathermap.org/data/2.5/weather?q=" + cityName +"&appid=" + apiKey;

  options = { 'muteHttpExceptions' : true};
  var response = UrlFetchApp.fetch(apiCall, options);
  if (response.cod != "404") {
    var spreadsheet = SpreadsheetApp.getActive();

    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); // planilha ativa
    var sheet = spreadsheet.getSheetByName("Clima"); 

    for (var i = 1; i < 10; i++) {

      var cel = "H"+ i //

      if (sheet.getRange(cel).getValue() != "")  {   

        for (var u = 1; i < 1000; u++) {
          var cel2 = "M"+ u //

          if (sheet.getRange(cel2).getValue() == "")  { 

            sheet.getRange("M"+u).setValue(sheet.getRange(cel).getValue());
            break;
          };
        }
      }
    };
    spreadsheet.getRange('Monster!A1').activate();
    spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});
    spreadsheet.getRange('Clima!F16').activate();
    spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});
  }

  var data = JSON.parse(response.getContentText());
  Logger.log(response.getContentText());

  var weather = data["weather"][0]; //It's an array
  var sys = data["sys"];
  var main = data["main"]
  var location = data["name"];
  var country = sys["country"];
  var weatherDesc = weather["main"];
  var temp = main["temp"];
  var minTemp = main["temp_min"];
  var maxTemp = main["temp_max"];

  var weatherData = [
    ["Location:", location],
    ["Country:", country],
    ["Weather:", weatherDesc],
    ["Teaperture:", temp],
    ["Min Temp:", minTemp],
    ["Max Temp:", maxTemp]
  ];

  sheet.getRange(3, 1, weatherData.length, weatherData[0].length).setValues(weatherData);



  //The API Call works
  // The Data will be retrieved like below JSON file.
  //{"coord":{"lon":139,"lat":35},
  //"sys":{"country":"JP","sunrise":1369769524,"sunset":1369821049},
  //"weather":[{"id":804,"main":"clouds","description":"overcast clouds","icon":"04n"}],
  //"main":{"temp":289.5,"humidity":89,"pressure":1013,"temp_min":287.04,"temp_max":292.04},
  //"wind":{"speed":7.31,"deg":187.002},
  //"rain":{"3h":0},
  //"clouds":{"all":92},
  //"dt":1369824698,
  //"id":1851632,
  //"name":"Shuzenji",
  //"cod":200}

  var spreadsheet = SpreadsheetApp.getActive();

  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); // planilha ativa
  var sheet = spreadsheet.getSheetByName("Clima"); 

  for (var i = 1; i < 10; i++) {

    var cel = "H"+ i //

    if (sheet.getRange(cel).getValue() != "")  {   

      for (var u = 1; i < 1000; u++) {
        var cel2 = "M"+ u //

        if (sheet.getRange(cel2).getValue() == "")  { 

          sheet.getRange("M"+u).setValue(sheet.getRange(cel).getValue());
          break;
        };
      }
    }
  };
  spreadsheet.getRange('Monster!A1').activate();
  spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});
  spreadsheet.getRange('Clima!F16').activate();
  spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});
}

当我执行它时,它做了所有的动作,但最终出现了一个错误信息,说:"TypeError: TypeError: TypeError"。

TypeError: 不能读取未定义的属性'0'。

google-apps-script google-sheets urlfetch
1个回答
1
投票

問題

基本上,这不是JavaScript(以及基于它的Google Apps Script)的工作方式。这里没有 goto JS中的语句,因此不能跳行(标签语句是个例外,但它们的使用是有限的)。

解决办法

你需要将第86行实现的逻辑作为一个单独的 function 以供重复使用,并将其调用到您的应用程序中。if 语句或用新的参数重新使用第86行的代码。

修改要点

  1. response!=404 在你的情况下,总是 true 作为 HTTPResponse 类实例永远不会等于一个整数。看看下面的参考,要想得到响应代码,你需要调用一个 getResponseCode() 方法。
  2. 此外,如果你在检查 误差的发生,你应该使用平等比较 == 而不是不等式 !=.

参考资料

  1. 标签声明 参考 在MDN上。
  2. HTTPResponse参考;
© www.soinside.com 2019 - 2024. All rights reserved.