javascript - 更新并插入数据而不是完全替换

标签 javascript google-apps-script google-sheets

我使用下面的代码来检索 XML 并将数据写入 Sheet2。 但是当我再次运行该函数时,它会再次将整个 xml 加载到工作表中。

我想实现什么,但不知道如何实现:

1. 获取 XML 并将其与 Sheet2 中已有的数据进行比较(基于 2 列): stationID & stationTypeID

2. 当两列匹配时,更新整行。当列不匹配时,在顶部插入新行。

  function loadOutposts(){
  var outposts= new Array();
  var url = "https://api.eveonline.com/eve/ConquerableStationList.xml.aspx";
  var parameters = {method : "get", payload : ""};
  var xmlFeed = UrlFetchApp.fetch(url, parameters).getContentText();
  var xml = XmlService.parse(xmlFeed);
  if(xml) {
    var rows=xml.getRootElement().getChild("result").getChild("rowset").getChildren("row");
    for(var i = 0; i < rows.length; i++) {
      outpost=[rows[i].getAttribute("stationID").getValue(),
                 rows[i].getAttribute("stationName").getValue(),
                 rows[i].getAttribute("stationTypeID").getValue(),
                 rows[i].getAttribute("solarSystemID").getValue(),
                 rows[i].getAttribute("corporationID").getValue(),
                 rows[i].getAttribute("corporationName").getValue()
                 ]
      outposts.push(outpost);
    }
  }
  //return outposts;
  SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet2').getRange(1,1,outposts.length,outposts[0].length).setValues(outposts);
};

感谢您的帮助!

最佳答案

这个修改怎么样?

流程:

  1. UrlFetchApp.fetch() 检索到的数据与电子表格上的现有数据进行比较。
  2. 当第 1 列和第 2 列相同时,现有数据将被更新。
  3. 当从 URL 检索的数据不包含在现有数据中时,该数据将插入到现有数据的顶部。这些现有数据成为新数据。
  4. 然后,电子表格上的数据将被新数据更新。

修改后的脚本:

function loadOutposts(){
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet2');

  var outposts= new Array();
  var url = "https://api.eveonline.com/eve/ConquerableStationList.xml.aspx";
  var parameters = {method : "get", payload : ""};
  var xmlFeed = UrlFetchApp.fetch(url, parameters).getContentText();
  var xml = XmlService.parse(xmlFeed);
  if (xml) {
    var rows=xml.getRootElement().getChild("result").getChild("rowset").getChildren("row");
    for(var i = 0; i < rows.length; i++) {
      outpost = [
        rows[i].getAttribute("stationID").getValue(),
        rows[i].getAttribute("stationName").getValue(),
        rows[i].getAttribute("stationTypeID").getValue(),
        rows[i].getAttribute("solarSystemID").getValue(),
        rows[i].getAttribute("corporationID").getValue(),
        rows[i].getAttribute("corporationName").getValue()
      ]
      outposts.push(outpost);
    }

    // ----- Added script
    if (ss.getLastRow() > 0) {
      var currentdata = ss.getRange(2, 1, ss.getLastRow(), ss.getLastColumn()).getValues(); // Updated
      currentdata.forEach(function(e1, i1){
        var temp = [];
        outposts.forEach(function(e2, i2){
          if (e1[0] == e2[0] && e1[1] == e2[1]) {
            currentdata[i1] = e2;
            temp.push(i2);
          }
        });
        for (var i in temp) {
          outposts.splice(temp[i], 1);
        }
      });
      Array.prototype.push.apply(outposts, currentdata);
    }
    // -----
  }
  ss.getRange(2,1,outposts.length,outposts[0].length).setValues(outposts);  // Updated
};

如果我误解了你的问题,我很抱歉。

关于javascript - 更新并插入数据而不是完全替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46339757/

相关文章:

javascript - 如何使用应用程序脚本计算单元格数量并根据它更改其他列中的上下文?

google-apps-script - Google Sheets onEdit 在不同列的工作表之间移动行

google-apps-script - 搜索整个电子表格以查找单元格内的文本,然后打印整行

javascript - 来自启动 slider js的随机图片

javascript - 我如何检查一个字符串在 JavaScript 中是否全部大写?

javascript - 编辑并替换没有元素 ID 的 DOM 节点

javascript - 海妖网站 API : Generate the message signature in Google App Script

javascript - 使用案例和日期创建作业日志

google-sheets - 如何避免 Google 文档电子表格中出现 "#DIV/0!"错误?

c# - 使用正则表达式查找字符串