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

时间:2017-09-21 09:05:45

标签: javascript google-apps-script google-sheets

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

我想要实现的目标,但不知道如何:

1。 获取de XML并将其与Sheet2中已有的数据进行比较,基于2个列: stationID& stationTypeID

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

                    <button class="btn btn-primary active" type="button">Test</button>

请求帮助!

1 个答案:

答案 0 :(得分:1)

这次修改怎么样?

流程:

  1. UrlFetchApp.fetch()检索到的数据与电子表格中的现有数据进行比较。
  2. 当它们的第1列和第2列相同时,将更新现有数据。
  3. 当从URL检索的数据未包含在现有数据中时,数据将插入到现有数据的顶部。现有数据成为新数据。
  4. 然后,电子表格上的数据会被新数据更新。
  5. 修改后的脚本:

    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
    };
    

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