range.getValues()具有特定单元格中的特定日期

时间:2018-03-01 12:01:43

标签: google-apps-script google-sheets

我们正在使用Google脚本将范围从其他电子表格导入另一个电子表格。 这在过去帮助了我们,但现在数据正在增长,我们需要减少我们导入的数据。 (超时问题)

我们需要在特定列上导入具有特定日期的行。 在这种情况下,正如您在下面的脚本中看到的那样,我们正在从' A1'中导入单元格。到最后一行' N在range变量中。

我们需要的是在“' H'从该范围日期检查类似于"日期在列K> =今天() - 90"

// iterate all the sheets
sourceSheetNames.forEach(function(sheetName, index) {
  if (EXCLUDED_SHEETS.indexOf(sheetName) == -1) {
    // get the sheet
    var sheet = sourceSpreadSheet.getSheetByName(sheetName);

    // selects the range of data that we want to pick. We know that row 1 is the header of the table,
    // but we need to calculate which is the last row of the sheet. For that we use getLastRow() function
    var lastRow = sheet.getLastRow();

    // N is because we want to copy to the N column
    var range = sheet.getRange('A1:N' + lastRow);

    // get the values
    var data = range.getValues();
    data.forEach(function(value) {
      value.unshift(sheetName);
    });
  }
});

2 个答案:

答案 0 :(得分:0)

我过去通过在电子表格中添加一个新列来解决此问题,该列计算事件发生后 n 天。

=ARRAYFORMULA(IF(ISBLANK(K2:K),"",ROUNDDOWN(K2:K - NOW())))

该功能的核心是倒计时计算。例如,今天是3月1日星期四。从未来的日期减去它,如3月4日星期日,返回一个完整的整数:3。我可以在一个简单的脚本中测试该整数(或任何整数)。

在脚本中,在执行函数的其余部分之前添加条件语句:

// ...
if(someDate === -90) {
  // do something...
}

这样,您只需检查单元格的值,而不是在辅助函数中进行计算。唯一的变化(如果你想要更长或更短的间隔)是在条件测试中。

答案 1 :(得分:0)

要有条件地复制符合条件的行,您需要将它们推送到符合条件的新数组。此推送会添加到您现有的data.forEach()来电中:

...
var now = new Date();
var today = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()));

var kept = [];
var data = range.getValues();
// Add qualifying rows to kept
data.forEach(function(row) {
  var colHvalue = row[7];
  var colKvalue = row[10];
  if( /* your desired test */) {
    // Add the name of the sheet as the row's 1st column value.
    row.unshift(sheetName);
    // Keep this row
    kept.push(row);
  }
});
/* other stuff with `kept`, like writing it to the new sheet */

您必须实施特定测试,因为您尚未分享时间在H或K列中的存储时间(例如,自纪元以来的天数,iso时间字符串等)。请务必查看Date参考。