Javascript 谷歌应用程序脚本-XML解析器-正则表达式
我使用的是一个谷歌应用程序脚本,它从一个表单中的提要中提取内容 这是我正在使用的代码:Javascript 谷歌应用程序脚本-XML解析器-正则表达式,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我使用的是一个谷歌应用程序脚本,它从一个表单中的提要中提取内容 这是我正在使用的代码: function processXML(FeedURL,sheetsFileDestinationURL,rawPasteSheetName,OPT_childNamesArray,OPT_Namespace){ var OPT_childNamesArray = ["link"]; // get only item url from the feed var GoogleSheetsFile
function processXML(FeedURL,sheetsFileDestinationURL,rawPasteSheetName,OPT_childNamesArray,OPT_Namespace){
var OPT_childNamesArray = ["link"]; // get only item url from the feed
var GoogleSheetsFile = SpreadsheetApp.openByUrl(sheetsFileDestinationURL);
var GoogleSheetsPastePage = GoogleSheetsFile.getSheetByName(rawPasteSheetName);
if (OPT_childNamesArray){
GoogleSheetsPastePage.getDataRange().offset(1,0).clearContent(); // get all filled cells, omitting the header row, and clear content
}
else {
GoogleSheetsPastePage.getDataRange().offset(0,0).clearContent(); // get all filled cells, INCLUDING the header row, and clear content
}
// Generate 2d/md array / rows export based on requested columns and feed
var exportRows = []; // hold all the rows that are generated to be pasted into the sheet
var XMLFeedURL = FeedURL;
var feedContent = UrlFetchApp.fetch(XMLFeedURL).getContentText(); // get the full feed content
var feedItems = XmlService.parse(feedContent).getRootElement().getChild('channel').getChildren('item'); // get all items in the feed
for (var x=0; x<feedItems.length; x++){
// Iterate through items in the XML/RSS feed
var currentFeedItem = feedItems[x];
var singleItemArray = []; // use to hold all the values for this single item/row
// Parse for specific children (requires names and namespace)
if (OPT_childNamesArray){
for (var y=0; y<OPT_childNamesArray.length; y++){
// Iterate through requested children by name and fill rows
var currentChildName = OPT_childNamesArray[y];
if (OPT_Namespace){
if (currentFeedItem.getChild(OPT_childNamesArray[y],OPT_Namespace)){
singleItemArray.push(currentFeedItem.getChildText(OPT_childNamesArray[y],OPT_Namespace));
}
else {
singleItemArray.push("null");
}
}
else {
if (currentFeedItem.getChild(OPT_childNamesArray[y])){
singleItemArray.push(currentFeedItem.getChildText(OPT_childNamesArray[y]));
}
else {
singleItemArray.push("null");
}
}
}
exportRows.push(singleItemArray);
}
// Parse for ALL children, does not require knowing names or namespace
else if (!OPT_childNamesArray){
var allChildren = currentFeedItem.getChildren();
if (x == 0){
// if looking at first item, create a header row first with column headings
var headerRow = [];
for (var h=0; h<allChildren.length; h++){
headerRow.push(allChildren[h].getName());
}
exportRows.push(headerRow);
}
for (var c=0; c<allChildren.length; c++){
singleItemArray.push(allChildren[c].getText());
}
exportRows.push(singleItemArray);
}
}
// Paste the generated md array export into the spreadsheet
if (OPT_childNamesArray){
GoogleSheetsPastePage.getRange(2,1,exportRows.length,exportRows[1].length).setValues(exportRows);
}
else if (!OPT_childNamesArray){
var maxRangeLength = 0;
var currentRowIndex = 1;
for (var x = 0; x<exportRows.length; x++){
if (exportRows[x].length > maxRangeLength){
maxRangeLength = exportRows[x].length;
}
GoogleSheetsPastePage.getRange(currentRowIndex,1,1,exportRows[x].length).setValues([exportRows[x]]);
currentRowIndex++;
}
}
}
基本上,正则表达式只应用于第一个url
如何使正则表达式应用于所有url
有什么帮助吗?
感谢您使用for对exportRow数组进行迭代,但是稍后,您不会在for中使用k迭代器 然后,您不会访问exportRows数组,只访问第一个位置:
var URL = exportRows[0].toString().replace(re, replacingItem);
不应该吗
var URL = exportRows[k].toString().replace(re, replacingItem);
在这种情况下,它将不起作用,因为它不是一个数组,所以通过这样做,您只保存在URL上for迭代器上生成的最后一个赋值,我相信您正在尝试执行以下操作:
for ( k=0; k < exportRows.length; k++) {
var re = '115-396/'
var replacingItem = '';
exportRows[k] = exportRows[k].toString().replace(re, replacingItem);
}
但是,exportRows的范围应该与getRange选择的范围相匹配,我不确定是否发生了这种情况
为了澄清这一点,exportRows.length
是数组的长度,exportRows[1]
是存储在数组位置1上的字符串/url的长度
希望这有帮助,问题也不是很清楚的意图,提供更多的信息,如果仍然不工作
如何知道你得到的产品的尺寸
var myrange = GoogleSheetsPastePage.getRange(2,1,exportRows.length,exportRows[1].length)
Logger.log(myrange.getNumRows());
Logger.log(myrange.getNumColumns());
您将能够知道getRange上的范围,并使其与exportRows大小匹配
确保检查随附文档,如果您有更多疑问,请打开一个与之相关的新问题。我认为提供
feedContent
或XMLFeedURL
的示例值以复制您的问题将帮助用户思考问题和解决方案。当然,请删除您的个人信息。谢谢您的帮助@Yuri。我尝试了您的代码,得到了您所说的错误:exportRows的范围与getRange选择的范围不匹配。我试图解决此问题,请参见编辑我的问题,但仍不起作用。已更新,如果您有更多疑问,请打开新问题。
var URL = exportRows[k].toString().replace(re, replacingItem);
for ( k=0; k < exportRows.length; k++) {
var re = '115-396/'
var replacingItem = '';
exportRows[k] = exportRows[k].toString().replace(re, replacingItem);
}
GoogleSheetsPastePage.getRange(2,1,exportRows.length,exportRows[1].length).setValues(exportRows);
var myrange = GoogleSheetsPastePage.getRange(2,1,exportRows.length,exportRows[1].length)
Logger.log(myrange.getNumRows());
Logger.log(myrange.getNumColumns());