我是google脚本的新手(任何针对此问题的编程,并将我在互联网上找到的一些脚本拼凑在一起,然后改变了一些我能想到的东西,使其适用于我的目的。我非常对此有所了解并感谢您提供的任何教学/解释,而不仅仅是“答案”。:)提前致谢!
简而言之,我创建了此脚本来根据Google日历计算员工工时。该脚本收集所有日历,提示我使用checkListBox,让我选择特定的日历名称,然后开始和结束事件范围的工资核算日期。我点击提交,它返回范围以及事件的长度(以小时为单位)。然后在脚本生成的标题中对其进行汇总,根据电子表格中其他位置的vlookup付费率计算员工小时的总薪资。
一切都很好....除了....时区在某个地方(7小时以上)。这是一个问题,因为有些事件发生在我选择的工资日期之外的日期。例如,一个活动日期从1月15日晚上8点开始(这是我的实际时区 - MST或GMT-7)。当您将7小时添加到晚上8点时,是在16日凌晨3点...工资单在15日午夜结束,此时间不计入总数。
我似乎无法弄清楚在哪里更改时区的脚本....我在Stackoverflow上执行的搜索要求我检查我的日历tz,并将其设置为MST(或GMT- 7)。我还检查了脚本属性,它的时区也设置为MST。有代码(我没有把它放在那里......就像我说我从其他地方复制了它)似乎表示带有时区的东西,但是当它被改变时它对脚本的输出没有影响。一个例子是在第一行:var FUS1 = new Date()。toString()。substr(25,6)+':00';
为了帮助您,我已经包含了以下代码。我不知道要包含哪些代码部分(记住,我是新手),所以我几乎添加了所有内容......如果不是犹太人,我道歉。
var FUS1=new Date().toString().substr(25,6)+':00';
//example : Fri Sep 24 2010 10:00:00 GMT+0200 (CEST)
//
function onOpen() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
Logger.log(FUS1)
var menuEntries = [{name: "Import from Calendar", functionName: "Cal_to_sheet"},
{name: "Delete all sheets", functionName: "delsheets"}
];
ss.addMenu("Calendar Uitilities", menuEntries);
}
//
function importEvents(e) {
var calendar_name = e.parameter.calendar;
var startDate = new Date(e.parameter.start);
var endDate = new Date(e.parameter.end);
var Calendar = CalendarApp.getCalendarsByName(calendar_name);
var sheetName = calendar_name
//
var events = Calendar[0].getEvents(startDate , endDate);
if (events[0]) {
var eventarray = new Array();
var line = new Array();
line.push('Event','Date','Hours');
eventarray.push(line);
for (var i = 0; i < events.length; i++) {
line = new Array();
FUS1=new Date(events[i]).toString().substr(25,6)+':00';
line.push(events[i].getTitle());
line.push(Utilities.formatDate(events[i].getStartTime(), FUS1, "MMM-dd-yyyy"));
line.push((events[i].getEndTime() - events[i].getStartTime()) / 3600000);
eventarray.push(line);
}
Logger.log(eventarray);// 2D array ready to write to sheet
var sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(sheetName);
sheet.getRange(3,1,eventarray.length,eventarray[0].length).setValues(eventarray);
sheet.setColumnWidth(1, 150);sheet.setColumnWidth(2, 75);sheet.setColumnWidth(3, 50)
sheet.setFrozenRows(1)
sheet.getRange('A' + (1)).setValue(sheetName).setBorder(true,true,true,true,true,true).setBackgroundColor('#6C86BA');
sheet.getRange('B' + (1)).setValue('').setBorder(true,true,true,true,true,true).setBackgroundColor('#6C86BA');
sheet.getRange('C' + (1)).setValue('Total \n Pay').setBorder(true,true,true,true,true,true).setBackgroundColor('#52CC52');
sheet.getRange('A' + (2)).setValue('Employee Pay Rate --->').setBorder(true,true,true,true,true,true).setBackgroundColor('#85A6E6');
sheet.getRange('B' + (2)).setFormula('=vlookup(A1,\'DO NOT MOVE!\'!H4:I,2,false)').setBorder(true,true,true,true,true,true).setBackgroundColor('#85A6E6');
sheet.getRange('C' + (2)).setFormula('=C3*B2').setBorder(true,true,true,true,true,true).setBackgroundColor('#66FF66');
sheet.getRange(3,1,1,3).setBorder(true,true,true,true,true,true).setBackgroundColor('#94B8FF');
sheet.getRange('A' + (3)).setValue('Event Description').setBorder(true,true,true,true,true,true).setBackgroundColor('#94B8FF');
sheet.getRange('B' + (3)).setValue('Total').setBorder(true,true,true,true,true,true).setBackgroundColor('#94B8FF');
sheet.getRange('C' + (3)).setFormula('=SUM(C4:C' + (i+3)+ ')').setBorder(true,true,true,true,true,true).setBackgroundColor('#94B8FF');
sheet.getRange('D' + (3)).setValue('Notes').setBorder(true,true,true,true,true,true).setBackgroundColor('#94B8FF');
} else {
var startstring = Utilities.formatDate(e.parameter.start, FUS1, "MMM-dd-yyyy");
var endstring = Utilities.formatDate(e.parameter.end, FUS1, "MMM-dd-yyyy");
Browser.msgBox('no event between ' + startstring + ' et le ' + endstring +' in calendar '+calendar_name);
}
var app = UiApp.getActiveApplication();
app.close();
return app;
}
function Cal_to_sheet() {
var doc = SpreadsheetApp.getActiveSpreadsheet();
var app = UiApp.createApplication().setTitle('Calendar Import').setHeight('320').setWidth('440').setStyleAttribute('background','beige');
// Create a grid with 3 text boxes and corresponding labels
var grid = app.createGrid(3, 2);
grid.setWidget(0, 0, app.createLabel('Calendar:').setWidth('100'));
var list = app.createListBox();
list.setName('calendar');
grid.setWidget(0, 1, list);
var calendars = CalendarApp.getAllCalendars();
for (var i = 0; i < calendars .length; i++) {
list.addItem(calendars[i].getName());
}
grid.setWidget(1, 0, app.createLabel('Payroll Start date:').setWidth('110'));
grid.setWidget(1, 1, app.createDateBox().setId("start"));
grid.setWidget(2, 0, app.createLabel('Payroll End date :').setWidth('110'));
grid.setWidget(2, 1, app.createDateBox().setId("end"));
var panel = app.createVerticalPanel();
panel.add(grid);
var button = app.createButton('Submit');
var handler = app.createServerClickHandler('importEvents');
handler.addCallbackElement(grid);
button.addClickHandler(handler);
panel.add(button);
app.add(panel);
doc.show(app);
}
再次感谢您的帮助,
ķ
答案 0 :(得分:0)
line.push(Utilities.formatDate(events[i].getStartTime(), "GMT-7", "MM-dd-yyyy HH:mm"));
看起来FUS1是一种通过从新的Date()方法中剥离一些字符来设置时区的奇特方式。我只是删除了对它的引用,并用MST的时区“GMT-7”替换它们。但是,如果您在时间表中使用它,也许您最好将事件开始时间保持为原始值(我认为自1900年以来以毫秒为单位)。您可以将最终值格式化为稍后使用其他函数的小时数和分钟数。
你可以像上面那样在那行中添加一个时区参数吗?设置变量时我使用了以下内容:
var date = Utilities.formatDate(new Date(), "GMT-6", "MM/dd/yyyy HH:mm");
在我的情况下,新的Date()取代了你的事件[i] .getStartTime(),并且它似乎需要尽可能多的参数,只要它们有意义。在使用Utilities.formatDate()的任何地方,将时区参数添加到列表中,并告诉我。
不幸的是,我没有链接或研究,因为我是新手,但我只是展示了我已经完成的代码。