如何循环一定范围的单元格并在相邻列中设置值

13

我正在学习Google应用脚本,并与Google电子表格一起使用。

我有一个包含多个网址的列,我想编写一个脚本来获取每个网址的标题元素,并将其写入相邻单元格。我已经为一个特定的单元格完成了此操作,如下面的脚本所示:

function getTitles() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("url_list");
  var range = sheet.getRange("G3");
  var url = range.getValue();

  var response = UrlFetchApp.fetch(url);
  var doc = Xml.parse(response.getContentText(),true);
  var title = doc.html.head.title.getText();
  var output = sheet.getRange("H3").setValue(title);

  Logger.log(title);
  return title;
}

这将获取G3中的URL,对其进行解析,提取元素并在H3中写入输出。

现在我有了这个基本的构建块,我想循环整个G列并将输出写入相邻的单元格,但我卡住了。有人能指点我正确的方向吗?

1个回答

25

可能长成这个样子:

function getTitles() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("url_list");
  var urls = sheet.getRange("G3:G").getValues();
  var titleList = [], newValues = [],
      response, doc, title;

  for (var row = 0, var len = urls.length; row < len; row++) {
    if (urls[row] != '') {
      response = UrlFetchApp.fetch(urls[row]);
      doc = Xml.parse(response.getContentText(),true);
      title = doc.html.head.title.getText();
      newValues.push([title]);  
      titleList.push(title);  
      Logger.log(title);
    } else newValues.push([]);
  }

  Logger.log('newValues ' + newValues);
  Logger.log('titleList ' + titleList);

  // SET NEW COLUMN VALUES ALL AT ONCE!
  sheet.getRange("H3").offset(0, 0, newValues.length).setValues(newValues);
  return titleList; 
}

1
谢谢Bryan,这非常优雅。我可以问一下,在这个解决方案中你使用了数组和push。从性能上来说,如果有很多行,这是否具有特定的优势?非常感谢您抽出时间发布这个! - needlesslosses
相对于其他选择,有什么优势?我将数据推送到了两个数组中,因为我不确定你是否只需要返回一个(titleList)且没有空值。 - Bryan P
1
是的,对于每一行使用setValue()不是正确的方法。 - Bryan P
@Bryan P 如果我想要对URL列运行=httpresponse,如何将状态写入相邻的列“H”? - user1788736
@user1788736 如果是我的话,我会写成 newValues.push([title, status]); 然后再加上 sheet.getRange("H3").offset(0, 0, newValues.length, newValues[0].length).setValues(newValues);。如果你还有问题,请开一个新的帖子。 - Bryan P
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接