【问题标题】:Google Script: Copy row if a value does exist in another sheetGoogle Script:如果另一个工作表中确实存在值,则复制行
【发布时间】:2014-09-09 04:01:58
【问题描述】:

我一直在做这个项目,但不能让它完全按照我想要的方式工作。我刚开始使用 Google Scripts,对它的了解还不是很广。

只有当 sheet2 中不存在数据时,我才需要将数据从 master 复制到 sheet2 中。我只想对照两张纸检查提交日期列(现在)。

大师

提交日期

2014 年 9 月 3 日 10:37:04

2014 年 9 月 3 日 20:03:27

2014 年 9 月 4 日 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

2014 年 9 月 5 日 10:54:10

表 2

提交日期

2014 年 9 月 3 日 10:37:04

2014 年 9 月 3 日 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);

  }
}

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

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

【问题讨论】:

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


    【解决方案1】:

    日期比较并不像“普通”变量比较那么简单......,我们必须得到日期原生值才能获得相等的条件。(它适用于 > 和

    下面是修改后的函数:

    请注意,我限制了范围以避免在两个 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);
      }
    }
    

    【讨论】:

    • 虽然这确实在一个小样本中完成了我想要的,但我的数据在每张表中包含超过 1500 行,并且在完成之前超时。这可能是一个单独的问题......但是在超过最大时间之前处理函数的任何提示?谢谢
    • 我很惊讶......你能看看执行记录,看看什么需要时间吗?此函数在数组级别工作并且非常快(通常)。谢谢
    • 看起来没有任何事情需要很长时间才能执行。我看到 Logger.log([true, []]) [0 seconds] 重复了 1,319。我假设这是通过查看每一行。谢谢
    • 修改该脚本以使其自动处理较小的数据集应该很容易...如果您在该特定点上发布新线程,我将很乐意回答(或其他人当然:-) - 同时你能接受这个,因为它解决了最初的问题。谢谢。
    • 在完成本主题之前,我还有一个问题。有没有办法只推送某些列而不是只推送一个或整行?谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多