要點:我能夠使用單個 URL的原始腳本成功檢索資料。現在我需要修改它以添加一個 for each 回圈來為我的 gsheet的 ColA 中的每個 url 重復腳本。經過 2 天的嘗試后,我認為我在這里有所收獲,但我知道這條線const str =UrlFetchApp.fetch(urls).getContentText();是錯誤的。當我有一個用于單個 url 的 const 并且我不知道如何更改它(或將它放在哪里)說:獲取并獲取范圍內每個 URLS 的內容時,它起作用了。我邊走邊學javascript,所以還是個新手。任何幫助深表感謝。
是的,我已經被警告不要使用正則運算式,但這有效,我周二需要它。稍后我將在沒有 Regex 的情況下重寫。
function LoopURLs() {
Loop_clearRecords();
let ss = SpreadsheetApp.getActive();
let sheet = ss.getSheetByName("UserDiary");
let urlRange = sheet.getRange('A3:A15');
let urls = urlRange.getValues();
const str = UrlFetchApp.fetch(urls).getContentText();
const mainRegex = /<td >([\s\S]*?)>Edit this entry\<\/a>/gi;
const results = str.match(mainRegex);
const filmIDRegex = /data-film-id="([0-9]*?)"/i;
const filmTitleRegex = /data-film-name="([\s\S]*?)"/i;
urls.forEach(function(row){
Logger.log('For each loop: ' row);
for(var i = 0; i < results.length; i ) {
const filmIDResults = (results[i].match(filmIDRegex) || ['','']);
const filmID1 = filmIDResults[0];
const filmID = filmIDResults[1];
Logger.log('filmIDcode: ' filmID1);
Logger.log('filmID: ' filmID);
const filmTitleResults = (results[i].match(filmTitleRegex) || ['','']);
const filmTitle1 = filmTitleResults[0];
const filmTitle = filmTitleResults[1];
Logger.log('titlecode: ' filmTitle1);
Logger.log('title: ' filmTitle);
};
})
Loop_addRecord(filmTitle, filmID );
}
function Loop_clearRecords()
{
var ss= SpreadsheetApp.getActiveSpreadsheet();
var tableSheet = ss.getSheetByName("UserDiary");
// select range to clear
tableSheet.getRange("C3:Z100").clear();
}
function Loop_addRecord(filmTitle, filmID) {
var ss= SpreadsheetApp.getActiveSpreadsheet();
var tableSheet = ss.getSheetByName("UserDiary");
var currentRow = tableSheet.getLastRow();
var nextRow = currentRow 1;
tableSheet.getRange(nextRow,4).setValue(filmID);
tableSheet.getRange(nextRow,5).setValue(filmTitle);
}
uj5u.com熱心網友回復:
從您的以下回復中,
原始腳本中有一個硬編碼的 url,它獲取該 url 的 filmTitle 和 filmID。但是我在單元格 A3-A13 中有多個 URL,我希望腳本為每個 URL 運行;所以對于 url#1,它運行并獲取 FilmTitle、FilmID、輸出,然后它獲取 URL#2、獲取 FilmTItle、FilmID、下面的輸出,并且它對 Col A 中的所有 url 重復。此外,我將此處顯示的腳本截斷為僅獲取兩個值(FilmTItle 和 FilmID)只是為了使其更簡單,因為一旦我知道如何回圈“每個 url”,我可以添加我稍后要查找的其他值,請執行此操作...
我在這里簡化腳本的原因之一是因為我認為它的形式很好;我看到很多人向發帖者抱怨他們的代碼太長了,他們應該只要求提供必需品。
我理解你這個問題的目標如下。
- 您想從單元格“A3:A11”中檢索 URL。并且,您想
filmTitle, filmID從每個 URL 中檢索 2 個值,并將檢索到的值放入作業表中的“C3”。
在這種情況下,下面的修改腳本怎么樣?
修改后的腳本:
function LoopURLs() {
let ss = SpreadsheetApp.getActive();
let sheet = ss.getSheetByName("UserDiary");
sheet.getRange("C3:Z100").clear();
let urlRange = sheet.getRange('A3:A13');
let urls = urlRange.getValues().map(([a]) => ({url: a, muteHttpExceptions: true}));
const res = UrlFetchApp.fetchAll(urls);
const values = res.flatMap(e => {
if (e.getResponseCode() == 200) {
const str = e.getContentText();
const mainRegex = /<td >([\s\S]*?)>Edit this entry\<\/a>/gi;
const results = str.match(mainRegex);
const filmIDRegex = /data-film-id="([0-9]*?)"/i;
const filmTitleRegex = /data-film-name="([\s\S]*?)"/i;
const temp = [];
if (results && results.length > 0) {
for (var i = 0; i < results.length; i ) {
const filmIDResults = (results[i].match(filmIDRegex) || ['', '']);
const filmID = filmIDResults[1];
const filmTitleResults = (results[i].match(filmTitleRegex) || ['', '']);
const filmTitle = filmTitleResults[1];
temp.push([filmID, filmTitle]);
}
return temp;
}
}
return [Array(2).fill("")];
});
sheet.getRange(3, 3, values.length, values[0].length).setValues(values);
}
- 在此修改中,使用 fetchAll 方法請求 URL。并且,從每個回應中檢索值并將值放入作業表。在這種情況下,
filmTitle, filmID從單元格“C3”中輸入 的值。
筆記:
- 這個修改后的腳本假設
filmTitle, filmID可以從您的 URL 中檢索 的值。請注意這一點。
參考:
- fetchAll(請求)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/434963.html
