2014-01-28 63 views
0

我是新的谷歌腳本(任何編程的事情,並拼湊在一起,我已經在互聯網上找到幾個腳本,然後改變了一些事情,我可以找出讓它適用於我的目的,我對此很感興趣,並希望能夠提供任何教學/解釋,而不僅僅是「答案」。:)提前致謝!谷歌腳本日曆事件時區關閉7小時

總之,我已經創建了這個腳本來計算基於谷歌日曆的員工小時數。該腳本收集所有日曆,提示我一個checkListBox,讓我選擇特定的日曆名稱,然後開始和結束事件範圍的工資日期。我點擊提交,並返回範圍以及事件的長度(以小時爲單位)。然後在腳本生成的頭文件中進行彙總,該頭文件根據電子表格中其他位置的查找工資率計算員工工時的總工資。

一切工作很好....除了...時區是關閉某個地方(7 + hrs)。這是一個問題,因爲有些事件會在我選擇的工資日期之外的日期發生。例如,一個事件日期從一月十五號晚上八點MST開始(這是我的實時時區 - 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
line.push(Utilities.formatDate(events[i].getStartTime(), "GMT-7", "MM-dd-yyyy HH:mm")); 

它看起來像FUS1是通過剝離一些字符出來的設置時區一個奇特的方式新的Date()方法。我只是將參考文獻剪下來,並替換爲MST的時區「GMT-7」。但是,如果你使用這個作爲時間表,也許你最好把事件的開始時間保持爲一個原始值(我認爲這是從1900年初開始的毫秒數)。您可以將該最終值格式化爲稍後使用其他函數工作的小時數和分鐘數。

你能像上面那樣向line.push添加一個時區參數嗎?我用設置一個變量時的情況如下:

var date = Utilities.formatDate(new Date(), "GMT-6", "MM/dd/yyyy HH:mm"); 

在我的情況下,新的Date()將您的活動[I] .getStartTime()的地方,它似乎採取許多參數,你只要它們有意義,就可以推動它。在你使用Utilities.formatDate()的地方,將timezone參數添加到列表中,並讓我知道。

不幸的是,我沒有鏈接或研究,因爲我是這方面的新手,但我只是展示了我已經完成的代碼的工作。