【问题标题】:Checking if date equal in Google Sheets/Google Scripts检查谷歌表格/谷歌脚本中的日期是否相等
【发布时间】:2018-08-30 13:10:49
【问题描述】:

我有 2 张工作表,它们都将日期保存到列中。我当前的日期使用相同的代码保存在 Sheet1 和 Sheet2 上:

curDate = Utilities.formatDate(new Date(), "EST", "MM/dd/yyyy");

我想让我的一个脚本比较从 Sheet1 到 Sheet2 的日期

在 Sheet1 上,我使用了一个小脚本来设置当前日期,然后使用拖动功能在列中使用相同的格式设置上一个和下一个日期:

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Update Dates')
      .addItem('Set Dates', 'setDatesUp')
      .addToUi();
}

function setDatesUp(){
  var app = SpreadsheetApp;
  var ss = app.getActiveSpreadsheet();
  var sheet1 = ss.getSheetByName("Sheet1");

  var curDate = Utilities.formatDate(new Date(), "EST", "MM/dd/yyyy");

  sheet1.getRange("A4").setValue(curDate);
}

设置 Sheet1 上的日期后,我使用以下脚本比较 Sheet1 和 Sheet2 中的日期,此脚本还设置 Sheet2 的日期,因为当此脚本被激活时,它应该在相应的框中标记当前日期.

function onEdit() {
  //Loops through all of Column C to determine which values are True and False
  //Saves all True Values Row # in SavedValues

  //Initialize Variables
  var app = SpreadsheetApp;
  var ss = app.getActiveSpreadsheet();
  var activeSheet = ss.getActiveSheet();
  var sheet2 = ss.getSheetByName("Sheet2");

  //Sheet 2 S2
  var cValuesS2 = sheet2.getRange("C:C").getValues();
  var dValuesS2 = sheet2.getRange("D:D").getValues();
  var lastRowS2 = sheet2.getLastRow();

  //Variables
  var curDate;
  var curVar;

  //Loops through all S2 rows, stops at last row
  for (var i = 0; i <= lastRowS2; i++){
    //Checks checkboxes in S2C:C for True OR "Complete" and adds dates in corresponding D:D cells
    if (cValuesS2[i] == "true" || cValuesS2[i] == "Complete") {
      //If D:i is empty
      if (dValuesS2[i] == "") {
        //Sets current date
        curDate = Utilities.formatDate(new Date(), "EST", "MM/dd/yyyy");
        //Set current D:i cell (*+1 offset)
        curVar = ("D" + (i + 1));
        //Sets curVar value to curDate
        sheet2.getRange(curVar).setValue(curDate);
      }
      //Checks checkboxes in S2C:C for False OR "Incomplete" and deletes dates in corresponding D:D cells
    } else if (cValuesS2[i] == "false" || cValuesS2[i] == "Incomplete") {
      //If D:i is NOT empty
      if (dValuesS2[i] != "") {
        //Set current D:i cell (*+1 offset)
        curVar = ("D" + (i + 1));
        //Sets curVar to ""
        sheet2.getRange(curVar).setValue("");
      }
    } 
  }
  updateS1();
}

最后我有我的脚本来比较两张表中的日期。

function updateS1() {
  //Initialize Variables
  var app = SpreadsheetApp;
  var ss = app.getActiveSpreadsheet();
  var activeSheet = ss.getActiveSheet();
  var sheet1 = ss.getSheetByName("Sheet1");
  var sheet2 = ss.getSheetByName("Sheet2");

  //Sheet 1 S1
  var aValuesS1 = sheet1.getRange("A:A").getValues();
  var lastRowS1 = sheet1.getLastRow();

  //Sheet 2 S2
  var dValuesS2 = sheet2.getRange("D:D").getValues();
  var lastRowS2 = sheet2.getLastRow();

  //Variables
  var curVar;
  var curVar2;

  //Loop through Sheet 1 until the bottom
  //For each value in S1 A I use i
  for (var i = 0; i <= lastRowS1; i++) {
    //Loop through Sheet 2 until the bottom
    //For each value in S2 D I use j
    for (var j = 0; j <= lastRowS2; j++) {
        //TODO: Compare dates from S1 A:i to S2 D:j
        //If they are the same date the if statement will execute
    }
  }
}

我已经尝试过使用以下

if (aValuesS1[i].toString() == dValuesS2[j].toString()) {
}

if (aValuesS1[i] == dValuesS2[j]) {
}

但是这两个选项都没有奏效。我注意到,当我在 Logger 中获取日期的“值”时,我会得到很多我不想要或不需要的信息:

2018 年 10 月 30 日星期四 00:00:00 GMT-0400 (EDT)

而不是 18 年 8 月 30 日。
我认为这就是即使我的两个框都显示格式相同的日期,我也没有得到“匹配”值的原因。老实说,我对如何解决这个问题感到困惑,所以任何帮助都将不胜感激。

【问题讨论】:

  • 我忘了提,我还认为使用拖动功能更改 Sheet1 上的日期可能会导致日期格式不同,但我不确定如何设置当前日期以外的日期日期(例如 2 天前,或 2 天后)
  • 当 Apps 脚本通过 getValue/s 读取包含可解析为 JavaScript Date 的内容的表格单元格时,它会返回相应的 Date 对象。在调试器中查看此变量将显示对象表示(例如Date#toString()),因此您会看到“额外信息”。根据链接,在数字上比较 Dates 是否相等。通过&lt;&gt; 比较会自动处理。
  • 如果您只关心字符串,请尝试使用aValuesS1[i].getValue().toString() == dValuesS2[j].getValue().toString()。这样它会获取单元格值,然后将其转换为字符串进行比较。
  • 看来我不能使用aValuesS1[i].getValue().toString() == dValuesS2[j].getValue().toString() 在我的 if 语句中,我停止从 if 语句的 true 或 false 得到任何响应。我现在正在查看stackoverflow.com/questions/492994/…,看看它是否能给我解决这个问题的方法

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


【解决方案1】:

事实证明,我实际上可以在我的 if 语句中与 .toString() 进行比较,我的循环在 Google Apps 脚本中执行只需要很长时间。

【讨论】:

  • 听起来你需要关注"Best Practices" - 我猜你在循环中的Range 上调用getValuesetValue,这是不行的。跨度>
  • 我是,谢谢你的链接,我马上开始优化!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多