通过For循环比较Google Apps脚本中的日期

时间:2018-08-25 03:58:41

标签: google-apps-script

我正在尝试将用户指定的日期与另一张纸上的数据库中的日期进行比较。该脚本应返回具有匹配日期的任何行的指定列。当前,它返回所有数据。无论值如何,似乎IF语句始终读为true。日志显示值不同。为什么该IF语句总是返回true,从而返回所有数据库行?下面的代码:

function search() 
{

//clears contents in search sheet (sheet1)
var app=SpreadsheetApp;
var WorkSheet =  app.getActiveSpreadsheet().getSheetByName("Sheet1");
WorkSheet.getRange("A2:D50").clearContent();

//store date search value - getrange x and get it's value
var DateSearch = WorkSheet.getRange(1,2).getValue();
//view variable for testing
Logger.log(DateSearch);

//data sheet lastrow variable
var dataSheet = app.getActiveSpreadsheet().getSheetByName("Form Responses 
1");
var a = dataSheet.getDataRange().getNumRows();
//view variable for testing
Logger.log(a);

//var i is looper
var i;
var dataI;
var copyValue;
//view if statement value for testing

for(i=2;i<=a;i++)
{
Logger.log(i);
dataI = dataSheet.getRange(i,1).getValue();
Logger.log(dataI); 
Logger.log(DateSearch);

if (dataI = DateSearch)
{
  // returns values in variable row and first 2 columns if condition is met
  copyValue = dataSheet.getRange(i, 1, 1, 2).getValues();
  //test copyValue
  Logger.log(copyValue);
  WorkSheet.getRange(i,1,1,2).setValues(copyValue);
    }
  }
}

1 个答案:

答案 0 :(得分:0)

此修改如何?

修改点:

  • 对于if (dataI = DateSearch),当DateSearch有一个值时,它始终作为true使用。这样,每次iftrue时的脚本都会起作用。
  • 比较2个日期值时,请转换为数字进行比较。
    • 这是@tehhowch中提到的

修改后的脚本:

为了反映以上几点,请进行以下修改,然后再次尝试运行。前者和后者分别比较Unix时间和每年,每月和每天。您可以选择2个样本之一。

从:
if (dataI = DateSearch)
至:
if (new Date(dataI).getTime() === new Date(DateSearch).getTime())

至:
if (new Date(dataI).getFullYear() === new Date(DateSearch).getFullYear() &&
    new Date(dataI).getMonth() === new Date(DateSearch).getMonth() &&
    new Date(dataI).getDate() === new Date(DateSearch).getDate())

其他修改:

顺便说一句,从脚本和示例电子表格来看,可以认为当数据数量变大时,处理时间将变长。因此,作为针对这种情况的其他修改,该怎么办?但是我不确定这对您的情况是否有用。因此,请将此作为示例脚本。

function search() {
  var app=SpreadsheetApp;
  var WorkSheet =  app.getActiveSpreadsheet().getSheetByName("Sheet1");
  WorkSheet.getRange("A2:D50").clearContent();
  var DateSearch = WorkSheet.getRange(1,2).getValue();
  var dataSheet = app.getActiveSpreadsheet().getSheetByName("Form Responses 1");

// Below script was modified.
  var dataI = dataSheet.getDataRange().offset(1, 0).getValues();
  var copyValue = dataI.map(function(e, i) {
    return new Date(e[0]).getTime() === new Date(DateSearch).getTime() ? e : ["", ""];
  });
  WorkSheet.getRange(2,1,copyValue.length,copyValue[0].length).setValues(copyValue);
}

参考文献:

如果此结果不是您想要的,请告诉我。我想修改它。

已添加:

此修改脚本将没有空行的检索到的值放入第2行。

function search() {
  var app=SpreadsheetApp;
  var WorkSheet =  app.getActiveSpreadsheet().getSheetByName("Sheet1");
  WorkSheet.getRange("A2:D50").clearContent();
  var DateSearch = WorkSheet.getRange(1,2).getValue();
  var dataSheet = app.getActiveSpreadsheet().getSheetByName("Form Responses 1");

// Below script was modified.
  var dataI = dataSheet.getDataRange().offset(1, 0).getValues();
  var copyValue = dataI.filter(function(e) { // Modified
    return new Date(e[0]).getTime() === new Date(DateSearch).getTime(); // Modified
  });
  WorkSheet.getRange(2,1,copyValue.length,copyValue[0].length).setValues(copyValue);
}