问题描述
我创建一个包含3个工作表的电子表格,“链接”,“有效链接”和“无效链接”,然后使用以下代码检查“链接”表中的每一行,如下所示:
function myFunction() {
var rows = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Links").getDatarange().getValues();
rows.forEach(function(row,index)
{
if (index !== 0)
{
var url = row[1];
var page = UrlFetchApp.fetch(url).getContentText();
var number = page.match("sample.com");
if (!number)
SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Valid Links").appendRow(url);
else
SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Invalid Links").appendRow(url);
}
});
}
但是,当我调试到UrlFetchApp.fetch(url)时,脚本突然中止。没有显示错误或异常。为什么?
我在Google Script Community上问了这个问题,但没有人回答。所以我不得不在这里问。我不知道如何在Google Script社区中获取问题的特定URL,因此我必须复制并粘贴问题。抱歉。
更新
在Tanaike的帮助下,我修复了错误:
解决方法
我相信您的目标如下。
- 您想通过使用
Valid Links
检查URL来将值放入Invalid Links
和UrlFetchApp.fetch
工作表中。 - 要检查的URL放在
Links
工作表的“ B”列中。
修改点:
- 在这种情况下,如何使用
muteHttpExceptions
作为UrlFetchApp.fetch
的选项?这样,即使请求失败,也可以检索响应值。-
muteHttpExceptions
的默认值为false
。在这种情况下,当请求发生错误时,脚本将停止。看来这是当前的规范。但是,当muteHttpExceptions
为true
时,即使请求发生错误,脚本也不会停止。
-
- 在脚本中,使用
appendRow(url)
,var url = row[1];
是列“ B”中的值。在这种情况下,url
必须为[url]
。 - 在
var number = page.match("sample.com");
的情况下,当sample.com
中包含page
时,url
被放在Invalid Links
表中。如果sample.com
中未包含page
,则url
将放在Valid Links
表中。我不确定这是否是您期望的结果。但是请注意这一点。 - 我认为使用
var ss = SpreadsheetApp.getActiveSpreadsheet();
时,可以降低处理成本。
当以上几点反映到您的脚本时,它如下所示。
修改后的脚本:
function myFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet(); // Added
var rows = ss.getSheetByName("Links").getDataRange().getValues(); // Added
rows.forEach(function(row,index) {
if (index !== 0) {
var url = row[1];
var page = UrlFetchApp.fetch(url,{muteHttpExceptions: true}).getContentText(); // Modified
var number = page.match("sample.com");
if (!number) {
ss.getSheetByName("Valid Links").appendRow([url]); // Added
} else {
ss.getSheetByName("Invalid Links").appendRow([url]); // Added
}
}
});
}
注意:
- 使用
fetchAll
时,可以进一步降低处理成本。但是我不确定URL的数量。因此,我不使用fetchAll
方法就像上面那样修改了脚本。
参考文献:
已添加:
另一个问题,当url为wisesoft.co.uk时,出现错误SSL错误wisesoft.co.uk(第10行,文件“代码”),脚本也中止。我使用Chrome浏览器,发现https错误,但是可以通过http版本访问该网站,如何忽略该错误并继续获取内容?
在这种情况下,如何按以下方式使用try...catch
?
修改后的脚本:
function myFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var rows = ss.getSheetByName("Links").getDataRange().getValues();
rows.forEach(function(row,index) {
if (index !== 0) {
var url = row[1];
try {
var page = UrlFetchApp.fetch(url,{muteHttpExceptions: true}).getContentText();
var number = page.match("sample.com");
if (!number) {
ss.getSheetByName("Valid Links").appendRow([url]);
} else {
ss.getSheetByName("Invalid Links").appendRow([url]);
}
} catch(e) {
ss.getSheetByName("Invalid Links").appendRow([url]);
}
}
});
}