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

问题描述 投票:0回答:2

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

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

我们需要的是在该范围日期的列'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);
    });
  }
});
google-apps-script google-sheets
2个回答
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参考。


0
投票

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

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.