Tính tổng số giờ của một sự kiện trong Lịch Google


7

Tôi đang tìm kiếm để xem hoặc nhận bản tóm tắt hàng tuần về số giờ cho mỗi sự kiện trong Google Calender.

Làm thế nào tôi có thể có được tổng số giờ này?

Câu trả lời:


3

Tôi đã viết một kịch bản trong Google Script, mà tôi muốn đóng góp trong trường hợp nó giúp người khác vấp phải câu hỏi này. Tôi đã điều chỉnh một số mã từ mã mẫu của Google trên API Lịch .

Các bước

  1. Truy cập Google Drive của bạn và bắt đầu một lây lan trống mới.
  2. Chuyển đến Menu: Công cụTrình chỉnh sửa tập lệnhTài liệu trống .
  3. Sao chép + dán vào Code.gs mới và lưu tệp
  4. Chuyển đến Menu: Tài nguyênDịch vụ Google nâng cao
  5. Cuộn đến khi bạn tìm ra API Lịch và biến nó ON
  6. Nhấp vào liên kết đến Bảng điều khiển dành cho nhà phát triển của Google. một tab mới sẽ mở ra.
  7. Trong hộp tìm kiếm, gõ Lịch và nhấp vào API Lịch và bật nó.
  8. Sau khi kích hoạt, quay lại cửa sổ với mã và nhấp OK để quay lại.
  9. Sửa đổi gbl ... vars cho phù hợp với sở thích của bạn.
  10. Chuyển đến Menu: ChạyRunMe
  11. Một yêu cầu ủy quyền sẽ bật popup chấp nhận nó.
  12. Nếu mọi việc suôn sẻ, bạn sẽ có thể quay lại trang tính và xem kết quả.

Đây là liên kết đến tập lệnh: http://gist.github.com/paucoma/7b7b6cecddfa79d25531#file-gglcaleventsons Lansheet-ss


2

Dựa trên nhu cầu của tôi, tôi phát hiện ra câu hỏi của bạn.

Sau này tôi đã tìm thấy một giải pháp dễ thương: GTimeReport


1
Nếu bạn liên kết với sản phẩm, vui lòng tiết lộ điều này trong câu trả lời của bạn và giải thích cách sản phẩm giải quyết vấn đề.
jonsca

Mặc dù câu trả lời này có thể đã được trả lời chi tiết hơn nhiều, v.v ... NÓ GIÚP TÔI RA KHỎI! Công cụ nhỏ tuyệt vời. Cảm ơn!
Sibe ngày

1

cuối cùng tôi đã sử dụng tập lệnh ứng dụng google trên bảng tính google, mã trong một ý chính .

// add menu
function onOpen() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var menuEntries = [{name:"Calcular Horas", functionName: "calculateHours"}];
ss.addMenu("Hours", menuEntries);
// calcular al iniciar
calculateHours();
}

function count_hours(cal_id, event_name){
var hours = 0;
var cal = CalendarApp.getCalendarById(cal_id);
var this_year = new Date(2013,0,1);
var now = new Date()
var events = cal.getEvents(this_year, now, {search: event_name});
for ( i = 0 ; i < events.length ; i++){
var event = events[i];
if ( event_name.toLowerCase() == event.getTitle().toLowerCase() ) {
//Logger.log(event.getTitle());
var start = event.getStartTime() ;
var end = event.getEndTime();
start = new Date(start);
end = new Date(end);
hours = hours + ( end - start ) / ( 1000 * 60 * 60 );
}
}
var cal_name = cal.getName();
// retorna el nombre del calendario y numero de horas del evento
return [cal_name, hours];
}

function hours_in_events(events){
var hours = 0;
for ( i = 0 ; i < events.length ; i++){
var event = events[i];
Logger.log(event.getTitle());
var start = event.getStartTime() ;
var end = event.getEndTime();
start = new Date(start);
end = new Date(end);
hours = hours + ( end - start ) / ( 1000 * 60 * 60 );
}
return hours;
}

function authorize() {
var oauthConfig = UrlFetchApp.addOAuthService("calendar");
var scope = "https://www.googleapis.com/auth/calendar";
oauthConfig.setConsumerKey("anonymous");
oauthConfig.setConsumerSecret("anonymous");
oauthConfig.setRequestTokenUrl("https://www.google.com/accounts/OAuthGetRequestToken?scope="+scope);
oauthConfig.setAuthorizationUrl("https://accounts.google.com/OAuthAuthorizeToken");
oauthConfig.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken");
}

/*
* Count hours of events with same name
*/
function countHours(calId, eventName){
authorize();
var cal = CalendarApp.getCalendarById(calId);
var key = "...";
var query = encodeURIComponent(eventName);
calId = encodeURIComponent(calId);
var params = {
method: "get",
oAuthServiceName: "calendar",
oAuthUseToken: "always",
};
var url = "https://www.googleapis.com/calendar/v3/calendars/"+
calId+"/events?q=" + query + "&key=" + key;
var request = UrlFetchApp.fetch(url, params);
var response = Utilities.jsonParse(request.getContentText());
//Logger.log(response);
var cal_name = response.summary;
var items = response.items;
var start, end;
var hours = 0;
for ( i = 0 ; i < items.length ; i++){
if ( items[i].status != "cancelled" ){
if ( items[i].summary == eventName ){
start = items[i].start.dateTime;
end = items[i].end.dateTime;
start = new Date(start.replace(/-/g,'/').replace(/[A-Z]/,' ').substr(0,19) );
end = new Date(end.replace(/-/g,'/').replace(/[A-Z]/,' ').substr(0,19));
hours = hours + ( end - start ) / ( 1000 * 60 * 60 );
}
}
}
// retorna el nombre del calendario y numero de horas del evento
return [cal_name, hours];
}

function calculateHours(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var id_cal_pos = 1;
var event_name_pos = 2;
var cal_name_pos = 1;
var total_hours_pos = 4;
var s = ss.getSheets()[0];
var rows = s.getDataRange();
var nRows = rows.getNumRows();
var values = rows.getValues();
// from second row
for ( var i = 1; i < nRows ; i ++){
var row = values[i];
var cal_hours = count_hours(row[id_cal_pos], row[event_name_pos]);
var h = cal_hours[1];
var cal_name = cal_hours[0];
s.getRange(i+1, cal_name_pos).setValue(cal_name);
s.getRange(i+1, total_hours_pos).setValue(h);
}
}

Và khi liên kết đó không còn hoạt động?
ale

@AlEverett không có gì là mãi mãi. Tôi thích đặt mã trong một github, vì tôi thực hiện cập nhật qua mã.
juanpablo

điều này rất hữu ích trong việc bắt đầu - cảm ơn vì ý chính! Chỉ cần biết rằng cần phải tạo một bảng tính trong đó ID lịch ở B2 và Tên cuộc họp nằm trong B3
Ultrasaurus

1

Một tiện ích thanh bên google (rất miễn phí) rất đẹp. Nó tính tổng các hoạt động theo các thẻ mà bạn viết trong mô tả sự kiện.

http: //www.thep sinhtgegame.com / TimeTracker

Các thẻ có thể được tạo trong mô tả nhiệm vụ theo mẫu:

thẻ: tagName1, tagName2, v.v.

trong đó tagName là tên thẻ / nhãn mà bạn muốn tóm tắt bằng


Tiện ích này không còn nữa (Tôi là tác giả).
David Braun
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.