【发布时间】: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读取包含可解析为 JavaScriptDate的内容的表格单元格时,它会返回相应的Date对象。在调试器中查看此变量将显示对象表示(例如Date#toString()),因此您会看到“额外信息”。根据链接,在数字上比较Dates 是否相等。通过<和>比较会自动处理。 -
如果您只关心字符串,请尝试使用
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