如果 UrlFetchApp 出错,muteHttpExceptions 跳转到第 86 行
muteHttpExceptions jump to line 86 if error in UrlFetchApp
我希望当出现错误时,脚本会从第 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: Cannot read property '0' of undefined
问题
基本上,这不是 JavaScript(以及基于它的 Google Apps 脚本)的工作方式。 JS 中没有 goto
语句,因此没有跳行(标签语句除外,但它们的使用是有限的)。
解决方案
您需要将第 86 行上实现的逻辑作为一个单独的 function
来重用,并在您的 if
语句中调用它,或者使用新参数重用第 86 行上的代码。
修改点数
response!=404
在你的情况下总是 true
因为 HTTPResponse
class 实例永远不会等于整数。查看下面的参考资料,要获取响应代码,您需要调用 getResponseCode()
方法。
- 此外,如果您要检查是否会发生错误,您应该使用等式比较
==
而不是不等式!=
。
参考
我希望当出现错误时,脚本会从第 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: Cannot read property '0' of undefined
问题
基本上,这不是 JavaScript(以及基于它的 Google Apps 脚本)的工作方式。 JS 中没有 goto
语句,因此没有跳行(标签语句除外,但它们的使用是有限的)。
解决方案
您需要将第 86 行上实现的逻辑作为一个单独的 function
来重用,并在您的 if
语句中调用它,或者使用新参数重用第 86 行上的代码。
修改点数
response!=404
在你的情况下总是true
因为HTTPResponse
class 实例永远不会等于整数。查看下面的参考资料,要获取响应代码,您需要调用getResponseCode()
方法。- 此外,如果您要检查是否会发生错误,您应该使用等式比较
==
而不是不等式!=
。
参考