【问题标题】:Working with Dates in Google Apps Script在 Google Apps 脚本中使用日期
【发布时间】:2013-11-14 09:20:35
【问题描述】:

我在这里尝试做的是 - 我只想为每周的工作日提供索引。

所以,如果在一周中,周一和周三是节假日,那么周二应该得到 1,周四应该得到 2,周五应该得到索引 3。否则,在没有任何假期的正常周内,周一应该得到 1,周二2、周三 3,以此类推...

这是我写的代码(我已经多年没有编码了,所以请原谅粗暴的方法)

  1. 工作表 'Holidays' 包含 B 列中从第 2 行开始的假期列表

  2. 变量date 是我要查找索引的日期

  3. 变量dayOfTheWeek是从上周日算起的“日期”的天数,所以如果date是周一,dayOfTheWeek就是1;如果date 是星期二,dayOfTheWeek 是 2,依此类推...

function indexOfWorkdayOfTheWeek (date, dayOfTheWeek, lastSundayDate)
{
  var activeSheet = SpreadsheetApp.getActiveSpreadsheet();
  var activeCell = activeSheet.getActiveRange();
  var activeRow = activeCell.getRowIndex();
  var activeColumn = activeCell.getColumn();

  var count = 1;

  for (var j = 1; j < dayOfTheWeek; j++) 
  {
    var date2 = lastSundayDate.valueOf() + j*86400;

    Logger.log('Date ' + j + ' is:' + date2);
    Logger.log('Last Sunday is:' + lastSundayDate);

    if (holidayOrNot(date2) == true) 
    {
    }
    else
    {
        count = count + 1;
    }
  }

  return count;
}

function holidayOrNot(date2)
{
  var holidaysSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Holidays');
  var listOfHolidays = holidaysSheet.getSheetValues(2, 2, 95, 1);      
  var isDateMatch = false;

  for (var k = 0; k < 90; k++) 
  {
    if (date2 == listOfHolidays[k].valueOf()) 
    {
      isDateMatch = true;
      break;
    }       
    else
    {
      continue;
    }
  }

  return isDateMatch;
}

我认为这里有两个问题:

  1. date2 计算由于某种原因无法正常工作 (var date2 = lastSundayDate.valueOf() + j*86400;)

  2. 函数holidayOrNot返回false,无论如何,即使遇到假期...条件date2 == listOfHolidays[k]由于某种原因不起作用...

我们将不胜感激!

【问题讨论】:

  • 1. lastSundayDate 在哪里定义? 2. 如果lastSundayDate 定义不正确,您的其余代码似乎会中断。好吧,至少您在问题中谈到的所有要点...我的建议是显示包含所有变量定义的所有代码,并可能从脚本编辑器发布执行脚本的结果,或者详细 Logging 的输出。
  • lastSundayDate 是传递给函数的参数之一。它包含上周日的日期,即一周开始的周日。我将发布执行脚本和日志。

标签: date google-apps-script


【解决方案1】:

也许下面的这种方法可以帮助您进行计算,它返回一个与一年中的某一天相对应的整数,因此如果您将其应用于您的假期并与感兴趣的日期进行比较,它可能是查找匹配项的好方法.

在这里,只需将这些行添加到脚本中的任何函数之外(这样您就可以在任何地方使用它),然后像这样使用它:

var d = new Date().getDOY();
Logger.log(d)

方法如下:

Date.prototype.getDOY = function() {
var onejan = new Date(this.getFullYear(),0,1);
return Math.ceil((this - onejan) / 86400000);
}

【讨论】:

  • 这实际上是一个非常有用的原型添加:)
  • 我认为我的回答解释了他的问题的根源,但你的回答提供了一个非常简单的解决方案 - 考虑到他在 Dates 上所做的工作量,他绝对应该使用这个解决方案。
【解决方案2】:

假设lastSundayDate 被正确传递,我看到一个明显的问题:

lastSundayDate.valueOf().

valueOf() on Date objects 返回 原始值...看起来您要在日期上添加一天(86400 秒 * j) ?我不知道这里的逻辑应该是什么。但是valueOf() date2 肯定会给你一个整数,比如:1384628769399(参见here)。

您真正想要完成的是Date.getDay() 或类似的东西,以便您可以在原始日期中添加小时、天等。这可能是您所有问题的根源。

您可以阅读 Date 对象上的 Mozilla Developer Network documentation 以查看 Date 上的所有函数及其用途。您可以通过使用这些函数大大简化您尝试做的事情,而不是像j * 86400 这样的抽象操作。

还需要注意的是,可以做如下简单的操作,将当前的Date(时间)加4小时:

var myDate = new Date();
Logger.log(myDate); // ~ console.write
var laterDate = new Date(myDate.setHours(myDate.getHours() + 4));
Logger.log(laterDate); // ~ console.write

给出以下内容:

[13-11-16 14:13:38:947 EST] Sat Nov 16 14:13:38 GMT-05:00 2013
[13-11-16 14:13:38:954 EST] Sat Nov 16 18:13:38 GMT-05:00 2013

使用日期可能很棘手 - 但最好使用最简单的可用方法,这些方法内置于 Date 对象本身中。还有许多其他库为日期提供扩展功能,例如 Date js

如果您在尝试使用我上面显示的方法后仍然遇到问题,请运行您的脚本并发布执行脚本和记录器的内容,以便我可以帮助您缩小问题范围 :)

【讨论】:

  • 非常感谢您的详细回答,但我找到了解决方案。有两个问题区域:传递给函数的日期是字符串而不是日期,因此我创建了日期对象并传递这些字符串以转换为正确的日期格式。其次,valueOf 函数给出了自 1970 年 1 月 1 日以来的确切毫秒数,因此要在日期中添加一天,我所要做的就是在经过的日期上添加 24*3600*1000 毫秒。现在,程序运行完美:)
  • 那么我在回答中所说的是否正确?我最初的假设是 lastSundayDate 没有被正确传递(正如你所说,它是 string 并注意 Date 应该是这样)。我的第二个通知是 valueOf() 您正在调用您的 Date,这不是您想要的操作。 @sergeinsas 还为您提供了一个有用的功能,您也可以在脚本中使用它。所以我认为至少将我们的一个答案标记为正确是合适的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多