繁体   English   中英

在Google Apps脚本中使用日期

[英]Working with Dates in Google Apps Script

我想在这里做的是 - 我想只给每周工作日索引。

因此,如果在一周,周一和周三是假期,那么周二应该得到1,周四应该得到2,周五应该得到指数3.否则,在没有任何假期的正常周,周一应该得到1,周二2,周三3,依此类推......

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

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

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

  3. 变量dayOfTheWeek是从上周日算起的'date'的天数,所以如果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]由于某种原因不起作用...

帮助将不胜感激!

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

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

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

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

lastSundayDate.valueOf()

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

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

您可以做的是阅读有关Date对象的Mozilla Developer Network文档 ,以查看日期及其用途的所有功能。 您可以通过使用这些函数大大简化您尝试执行的操作,而不是像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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM