感谢Serge insas对here和here的见解,这对我来说已经是天赐之物了。但是......我无法将所有内容与日期验证捆绑在一起。
为了澄清,我有一个GAS旨在验证A列中的日期是(a)超过七天,(b)不为空。如果两者都通过,则脚本确定列G中的第一个空行,然后在完成各种功能之前暂停。脚本的开头看起来像......
function getStats() {
var doc = SpreadsheetApp.getActiveSpreadsheet();
var sheet = doc.getSheetByName("Main");
var TITLE_ROW = 1;
var DATE_COL = 1;
var URL_COL = 4;
var sevendaysBefore = new Date(new Date().getTime()-7*24*60*60*1000);
if (DATE_COL != ''||(DATE_COL != null || DATE_COL< sevendaysBefore)) {
var end = sheet.getLastRow();
for( var i = 1; i < end; i++) {
var Gvals = sheet.getRange("G1:G").getValues();
var Glast = Gvals.filter(String).length;
var rowNum = TITLE_ROW+Glast;
var itemurl = sheet.getRange(rowNum,URL_COL).getValues();
Utilities.sleep(500);
...
但是,我已经明确地实施了一些错误,因为日期验证不起作用 - 该脚本似乎就像A列中的数据并不重要一样。我确定我做过一些非常愚蠢的事情,但我太无知了,无法自己发现它。那么......任何人都知道我忽略了什么?答案 0 :(得分:1)
错误:您正在硬编码DATE_COL = 1并且您在if语句中使用它。它没有得到细胞的价值。此外,我没有收到您的陈述,而A列的日期是(a)超过七天的日期&#34;。该日期是来自一个单元格,还是您正在遍历A列中的所有单元格?
下面的代码将满足您的需求,我测试了。这里举例说明我正在检查单元格R1C1(A1)的日期验证。
1)从细胞中获取日期。您可以更改它或在列中迭代单元格以获取日期 2)我们有date.valueOf()方法,它返回自1970-01-01午夜以来的毫秒数 3)验证:检查单元格数据是否为日期且大于7天
function compDate()
{
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var cell = sheet.getRange("A1"); //point1
var date01 = new Date();
var date02 = cell.getValue(); //point2
var dateDiff = (date01.valueOf()-date02.valueOf())/(24*60*60*1000);
if((isValidDate(date02)) == true && dateDiff > 7) //point3
Logger.log("success");
}
//below function will return true if the arg is valid date and false if not.
function isValidDate(d) {
if ( Object.prototype.toString.call(d) !== "[object Date]" )
return false;
return !isNaN(d.getTime());
}
答案 1 :(得分:1)
虽然另一个答案可能有效(没有测试),但它的方法与你的方法截然不同。
下面的代码遵循与您相同的逻辑,但在数组级别工作(遵循Best practices中的建议)。
我添加了一些评论以显示差异,希望它能帮助您了解它的工作原理。
function getStats() {
var doc = SpreadsheetApp.getActiveSpreadsheet();
var sheet = doc.getSheetByName("Main");
var Glast; // define the variable for later use
var vals = sheet.getDataRange().getValues();// get all data in an array (do that before loop)
var TITLE_ROW = 0;// use array index instead of real row numbers
var DATE_COL = 0;// use array index instead of real column numbers
var URL_COL = 3;// use array index instead of real column numbers
var sevendaysBefore = new Date(new Date().getTime()-7*24*60*60*1000).getTime();// get native value in milliseconds to make comparison easier below
for( var i = 1; i < vals.length; i++) { // start loop from Row 2 (=array index 1)
if(vals[i][0]!='' && vals[i][0]!=null&&vals[i][0].getTime()<sevendaysBefore){continue};// use && instead of ||, we want ALL conditions to be true ( see !='' and !=null)
Glast = i; break ;// first occurrence of data meeting above condition (non null and date < 7 days before)
}
var itemurl = vals[Glast][URL_COL];// get the value from the array
Utilities.sleep(500);
//...