谷歌脚本日历事件时区关闭7小时

时间:2014-01-28 07:54:58

标签: javascript calendar timezone

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

再次感谢您的帮助,

ķ

1 个答案:

答案 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()的任何地方,将时区参数添加到列表中,并告诉我。

不幸的是,我没有链接或研究,因为我是新手,但我只是展示了我已经完成的代码。