0

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

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

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

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

  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]由于某种原因不起作用......

帮助将不胜感激!

4

2 回答 2

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);
}
于 2013-11-16T20:59:26.233 回答
0

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

lastSundayDate.valueOf().

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

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

您可以做的是阅读有关 Date 对象的Mozilla Developer Network 文档,以查看有关 Dates 的所有功能及其用途。您可以通过使用这些函数大大简化您尝试做的事情,而不是像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 对象本身。还有许多其他库为 Dates 提供扩展功能,例如Date js

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

于 2013-11-16T19:18:45.927 回答