Validation 在Google应用程序脚本中使用If/Then函数进行日期验证

Validation 在Google应用程序脚本中使用If/Then函数进行日期验证,validation,google-apps-script,Validation,Google Apps Script,感谢谢尔盖·因萨斯的洞察力,这对我来说已经是天赐之物了。但是…我很难把所有的事情都和日期确认联系起来 为了澄清,我有一个GAS计划验证a列中的日期是否(a)超过七天,以及(b)是否为空。如果两者都通过,脚本将确定G列中的第一个空行,然后在完成各种函数之前暂停。脚本的开头看起来像 function getStats() { var doc = SpreadsheetApp.getActiveSpreadsheet(); var sheet = doc.getSheetByName("Main");

感谢谢尔盖·因萨斯的洞察力,这对我来说已经是天赐之物了。但是…我很难把所有的事情都和日期确认联系起来

为了澄清,我有一个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);
函数getStats(){ var doc=SpreadsheetApp.getActiveSpreadsheet(); var sheet=doc.getSheetByName(“主”); var TITLE_ROW=1; 风险值日期=1; var URL_COL=4; var sevendaysBefore=新日期(new Date().getTime()-7*24*60*60*1000); 如果(日期列!=“”(日期列!=null | |日期列


不过,我显然实现了一些错误,因为日期验证不起作用。脚本的功能似乎与A列中的数据无关。我肯定我做了一些非常愚蠢的事情,但我太无知了,无法自己发现。所以……有人知道我忽略了什么吗?

错误:你在硬编码日期=1,并且您正在if语句中使用该值。它没有获取单元格的值。此外,我没有获取您的语句“A列中的日期(A)超过七天”。该日期是来自单元格还是您正在迭代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());
}

虽然另一个答案可能有效(没有测试),但它的方法与您的方法非常不同

下面的代码遵循与您相同的逻辑,但在阵列级别工作(遵循中的建议)

我添加了一些注释以显示差异,希望它能帮助您理解它是如何工作的

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);
  //...
函数getStats(){ var doc=SpreadsheetApp.getActiveSpreadsheet(); var sheet=doc.getSheetByName(“主”); var Glast;//定义变量供以后使用 var vals=sheet.getDataRange().getValues();//获取数组中的所有数据(在循环之前执行此操作) var TITLE_ROW=0;//使用数组索引而不是实行数 var DATE\u COL=0;//使用数组索引而不是实数列编号 var URL_COL=3;//使用数组索引而不是实数列编号 var sevendaysBefore=new Date(new Date().getTime()-7*24*60*60*1000)。getTime();//以毫秒为单位获取本机值,以便在下面进行比较 对于(var i=1;iif(vals[i][0]!=''&&vals[i][0]!=null&&vals[i][0].getTime()非常感谢你们在这里的见解。Joachin:很抱歉我不清楚。A列中有数百个不同的日期时间。我希望我的脚本只处理A列中日期时间早于7天或更早的行。是否有方法利用您的解决方案应用于一系列日期(即A1:A300)?Serge:你的笔记和脚本都很好地满足了我的要求,也被很好地采纳了。不过,为了便于翻译,我有点麻烦。为了澄清,我想验证的日期占据了电子表格中的a列,所以我假设“VAL”应该定义为“sheet.getRange(“A2:a”).getValues(),对吗?实际上,我的代码从工作表中获取所有数据,并使用数组索引来选择正确的值…在本例中,A列中的值使用VAL[I][0]。。我发现这样更简单:-)我手头上有所有值可供使用!哦,太棒了!再次感谢!