【问题标题】:How to Transfer Row based on Criteria - Google Apps Script如何根据条件传输行 - Google Apps 脚本
【发布时间】:2019-04-17 16:15:27
【问题描述】:

我正在设置一个工具,它可以根据行的年龄(>= 30 天)将行传输到不同的电子表格。

我已经根据条件(>= 30 天)想出了删除该行,但我似乎无法弄清楚如何成功移动该行。我一直在编写两段代码,它们似乎只需要一两次调整,但我无法弄清楚这些调整是什么。

第一:

function CopyDataToNewFile() {
  var ss SpreadsheetApp.openById('ID'); // sss = source spreadsheet
  var sheet = ss.getSheetByName('Sheet1'); // sh = source sheet
  var ass = SpreadsheetApp.openById('ID'); // ass = archive spreadsheet
  var as = ass.getSheetByName('Sheet2'); // as = archive sheet 
  var datarange = sheet.getDataRange(); //Get full range of data source
  var a_datarange = as.getDataRange(); // Get full range of archive
  var lastrow = datarange.getLastRow(); // get last row of data source
  var values = datarange.getValues(); // get all data in a 2D array
  var A1Range = datarange.getA1Notation(); //get A1 notation source
  var monthOld = Date.now() + -30 * 24 * 3600 * 1000; //adds 1 month to today

  for (i = lastrow; i >= 1; i--) {
    var tempDate = values[i - 1][4];
    if ((tempDate != "") && (tempDate <= monthOld)) {

      sheet.getRange(datarange.getRow(), 1, 1, sheet.getLastRow()).moveTo(a_datarange);

    } //closes if
  } //closes for loop
} //closes function

在这里,我收到错误: “目标范围和源范围必须在同一个电子表格中。(第 49 行,文件“删除”):

我相信这意味着 moveTo() 不能在这里使用,但我不知道用什么代替。

第二个

function MoveOldEntries() {

  var sss = '1kKFvRT4hCclHQRsQ_4Z3wNifGirXczfViCi31Nw_wD0';
  var ass = '1K2xDQEGnFcUcs3u3Cj86z6UsxR35kdRV_awMFFeXKt0';
  var s_sheet1 = SpreadsheetApp.openById(sss).getSheets()[0];
  var a_sheet1 = SpreadsheetApp.openById(ass).getSheets()[0];
  var lr = s_sheet1.getLastRow();

  var rows = s_sheet1.getDataRange();
  var numRows = rows.getNumRows();
  var values = rows.getValues();

  for (i = lr; i >=1; i--) {
    var oldDate = Date.now() + - 90 * 24 * 3600 * 1000;     // or var oldDate =  new Date('values[i][1]')
    var curDate = new Date();
    var tempDate = values[i-1][4]
    if ((tempDate!="") && (tempDate <= (oldDate))) {
      a_sheet1.appendRow([values])
  }
}
}

这会将正确的行数返回到存档表,但它是乱码:

[Ljava.lang.Object;@1534974f    
[Ljava.lang.Object;@5fd49386    
[Ljava.lang.Object;@199384d5    
[Ljava.lang.Object;@6cd6e3a6    
[Ljava.lang.Object;@152fec74    
[Ljava.lang.Object;@58300fb3    
[Ljava.lang.Object;@1e50f226    

感谢您对更改内容的任何想法。我已经为此工作了好几天!

【问题讨论】:

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


    【解决方案1】:

    使用下面的代码。由于不能移动,所以需要获取值,过滤,然后设置值到目的地。

    function CopyDataToNewFile() {
      var ss = SpreadsheetApp.openById('ID'); // sss = source spreadsheet
      var sheet = ss.getSheetByName('Sheet1'); // sh = source sheet
      var values = sheet.getDataRange().getValues(); // get all data in a 2D array
    
      var ass = SpreadsheetApp.openById('ID'); // ass = archive spreadsheet
      var as = ass.getSheetByName('Sheet2'); // as = archive sheet
    
      var monthOld = Date.now() + (-30 * 24 * 3600 * 1000); //adds 1 month to today
      var results = [];
    
      values.forEach(function(row) {
        var tempDate = row[4];
        if (tempDate != '' && tempDate <= monthOld) {
          results.push(row);
        }
      });
    
      // results.unshift(values[0]); // uncomment this if you want the column names from source sheet to copy
    
      as.getRange(as.getLastRow()+1, 1, results.length, results[0].length).setValues(results);
    }
    

    【讨论】:

    • 谢谢@ra89fi。这几乎正​​是我正在寻找的。使用你给我的例子,有没有办法确保在存档表的最后一行(as之后添加行?就目前而言,此代码将在每次运行时覆盖现有数据。
    • 非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 2015-01-01
    • 1970-01-01
    相关资源
    最近更新 更多