在Google Apps脚本中使用日期

时间:2013-11-14 09:20:36

标签: date google-apps-script

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

所以,如果在一周,周一和周三是假期,那么周二应该得到1,周四应该得到2,周五应该得到指数3.否则,在没有任何假期的正常周,周一应该得到1,周二2,星期三3,等等...

以下是我编写的代码(我现在没有编写代码,所以请原谅粗略的方法)

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

  2. 变量date是我想找出

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

  5. 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]因某种原因无效......

    3. 帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

下面这个方法也许可以帮助你进行计算,它返回一个对应于一年中某一天的整数,所以如果你把这个应用到你的假期日并与感兴趣的天数比较,这可能是找到匹配的好方法

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

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);
}

答案 1 :(得分:0)

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

lastSundayDate.valueOf()

日期对象上的

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

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

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

还应注意,您可以执行以下简单操作,将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

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