[英]Working with Dates in Google Apps Script
我想在这里做的是 - 我想只给每周工作日索引。
因此,如果在一周,周一和周三是假期,那么周二应该得到1,周四应该得到2,周五应该得到指数3.否则,在没有任何假期的正常周,周一应该得到1,周二2,周三3,依此类推......
这是我写的代码(我现在没有编写多年,所以请原谅粗略的方法)
工作表'Holidays'
包含从第2行开始的B列中的假期列表
变量date
是我想要找到索引的日期
变量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;
}
我认为这个问题有两方面:
由于某种原因, date2
计算不起作用( var date2 = lastSundayDate.valueOf() + j*86400;
)
函数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.