Google脚本:如果另一个工作表中存在值,则复制行

时间:2014-09-05 18:11:11

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

我一直致力于这个项目,并且不能按照我想要的方式让它工作。我刚开始使用谷歌脚本,我对它没有太多的了解。

我需要将数据从master复制到sheet2中,只要它已经存在于sheet2中。我只想针对这两张表检查提交日期列(现在)。

提交日期

9/3/2014 10:37:04

9/3/2014 20:03:27

9/4/2014 0:47:14

2014/9/4 14:23:22

2014/9/4 14:31:49

2014/9/4 15:48:41

2014/9/4 15:55:16

9/5/2014 10:54:10

Sheet2的

提交日期

9/3/2014 10:37:04

9/3/2014 20:03:27

我需要Master中的最后6个提交日期才能复制到Sheet2。我尝试了各种代码,这是我正在使用的最后一次迭代,部分借鉴了这篇文章:Post

function updateSheet() {

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sourceSheet = "Submissions"; 
var destinationSheet = "Applicant";
var source_sheet = ss.getSheetByName(sourceSheet);
var target_sheet = ss.getSheetByName(destinationSheet);
var lastCol = target_sheet.getLastColumn();
var lastRow = target_sheet.getLastRow();

//assumes headers in row 1
var r = target_sheet.getRange(2,1, lastRow - 1, lastCol);

//Note the use of an array
r.sort([{column: 1, ascending: true}]);


  // Process sheet
  _updateSpreadsheet(source_sheet, target_sheet);

}


function _updateSpreadsheet(source_sheet, target_sheet) {
var last_row = target_sheet.getLastRow();  
var source_data = source_sheet.getDataRange().getValues();
var target_data = target_sheet.getDataRange().getValues();
var resultArray = [];

for (var n in source_data) {
  var keep = true;
   for(var p in target_data) {
      if (source_data[n][0] == target_data[p][0]) {
                 keep = false; break;
      }
    }

    // If no duplicate, add to sheet
if(keep){ resultArray.push(source_data[n])};
last_row++;
target_sheet.getRange("A"+last_row).setValue(source_data[n][0]);
target_data.push(n);

  }
}

它不是仅添加最后的记录,而是添加所有记录。

显然我错过了一些东西,但我无法理解。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

日期比较不像"正常"变量比较...,我们必须得到日期本机值才能获得相同的条件。(适用于>和<虽然)

以下是修改后的功能:

请注意,我限制范围以避免在for循环中包含比较中的标题 另外:我不理解最后的陈述,所以我评论了它。

function _updateSpreadsheet(source_sheet, target_sheet) {
  var last_row = target_sheet.getLastRow();  
  var source_data = source_sheet.getDataRange().getValues();
  var target_data = target_sheet.getDataRange().getValues();
  var resultArray = [];

  for (var n = 1 ; n < source_data.length ; n++) {
    var keep = true;
    for(var p = 1 ; p < target_data.length ; p++) {
      if (new Date(source_data[n][0]).getTime() == new Date(target_data[p][0]).getTime()) {
        keep = false; break;
      }
    }
    Logger.log(keep);
    if(keep){ resultArray.push([source_data[n][0]])};
  }
  last_row++;
  Logger.log(resultArray);
  target_sheet.getRange(last_row,1,resultArray.length,resultArray[0].length).setValues(resultArray);
//  target_data.push(n);
}

另见我添加的记录器,它帮助我检查发生了什么; - )

编辑:

我不确定你想要复制行还是只复制A列中的单元格......如果你想要复制行,请使用:

if(keep){ resultArray.push(source_data[n])};

编辑2:

根据您的评论,这是一个只复制目标表中某些列的版本:

(在现有代码中插入此部分)

     ...
//   if(keep){ resultArray.push(source_data[n])};
//   if(keep){ resultArray.push([source_data[n][0]])};
    var columnsToKeep = [0,1,3,4,6,7,8,9,10,11,12,13,15,21,22];
    var tempData = [];
    if(keep){
      for(var c in columnsToKeep){ tempData.push(source_data[n][columnsToKeep[c]])};
    resultArray.push(tempData);
    }     
  }
  last_row++;
  ...

编辑3:

可读性的最终代码

function _updateSpreadsheet(source_sheet, target_sheet) {
  var last_row = target_sheet.getLastRow();  
  var source_data = source_sheet.getDataRange().getValues();
  var target_data = target_sheet.getDataRange().getValues();
  var resultArray = [];

  for (var n = 1 ; n < source_data.length ; n++) {
    var keep = true;
    for(var p = 1 ; p < target_data.length ; p++) {
      if (new Date(source_data[n][0]).getTime() == new Date(target_data[p][0]).getTime()) {
        keep = false; break;
      }
    }
    Logger.log(keep);
 //   if(keep){ resultArray.push(source_data[n])};
//    if(keep){ resultArray.push([source_data[n][0]])};
    var columnsToKeep = [0,1,3,4,6,7,8,9,10,11,12,13,15,21,22];
    var tempData = [];
    if(keep){
      for(var c in columnsToKeep){ tempData.push(source_data[n][columnsToKeep[c]])}
    resultArray.push(tempData);
    }     
  }
  last_row++;
  Logger.log(resultArray);
  if(resultArray.length>0){
    target_sheet.getRange(last_row,1,resultArray.length,resultArray[0].length).setValues(resultArray);
  }
}