UrlFetchApp.fetch 会中止脚本吗?
UrlFetchApp.fetch will abort the script?
我创建了一个传播sheet 3 sheets,“链接”,“有效链接”和“无效links”,然后使用以下代码检查每个在“链接”中排sheet,如下:
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 脚本社区上问过这个问题,但没有人回答。所以我必须在这里问。我不知道如何在 Google 脚本社区上获得我的问题的具体 URL,所以我必须复制并粘贴问题。抱歉。
更新
在 Tanaike 的帮助下,我修复了我的错误:
我认为行[1]指的是A列,但它实际上指的是B列,这是一个未定义的值,所以导致错误。
!number应该改成number,好像(number)表示匹配所以结果有效link.
我相信你的目标如下。
- 您想通过使用
UrlFetchApp.fetch
. 检查 URL 来将值赋给 Valid Links
和 Invalid Links
sheet
- 检查的URL放在
Links
sheet的“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
sheet中。当 sample.com
不包含在 page
中时,url
放在 Valid Links
sheet 中。我不确定这是否是您期望的结果。但请注意这一点。
- 我觉得用
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
方法。
参考文献:
已添加:
关于,
One more question, when url is wisesoft.co.uk, I get error SSL Error wisesoft.co.uk (line 10, file "Code") and the script also abort. I use Chrome and find https has error but the site can be visited via http version, how to ignore such an error and continue fetch the contents?
在这种情况下,使用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]);
}
}
});
}
我创建了一个传播sheet 3 sheets,“链接”,“有效链接”和“无效links”,然后使用以下代码检查每个在“链接”中排sheet,如下:
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 脚本社区上问过这个问题,但没有人回答。所以我必须在这里问。我不知道如何在 Google 脚本社区上获得我的问题的具体 URL,所以我必须复制并粘贴问题。抱歉。
更新
在 Tanaike 的帮助下,我修复了我的错误:
我认为行[1]指的是A列,但它实际上指的是B列,这是一个未定义的值,所以导致错误。
!number应该改成number,好像(number)表示匹配所以结果有效link.
我相信你的目标如下。
- 您想通过使用
UrlFetchApp.fetch
. 检查 URL 来将值赋给 - 检查的URL放在
Links
sheet的“B”栏中。
Valid Links
和 Invalid Links
sheet
修改点:
- 这样的话,用
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
sheet中。当sample.com
不包含在page
中时,url
放在Valid Links
sheet 中。我不确定这是否是您期望的结果。但请注意这一点。 - 我觉得用
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
方法。
参考文献:
已添加:
关于
One more question, when url is wisesoft.co.uk, I get error SSL Error wisesoft.co.uk (line 10, file "Code") and the script also abort. I use Chrome and find https has error but the site can be visited via http version, how to ignore such an error and continue fetch the contents?
在这种情况下,使用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]);
}
}
});
}