Event Merge for Google Calendar™ (by @imightbeAmy)

Script that visually merges the same event on multiple Google Calendars into one event.

当前为 2017-05-18 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Event Merge for Google Calendar™ (by @imightbeAmy)
  3. // @namespace gcal-multical-event-merge
  4. // @include https://www.google.com/calendar/*
  5. // @include http://www.google.com/calendar/*
  6. // @include https://calendar.google.com/*
  7. // @include http://calendar.google.com/*
  8. // @require https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
  9. // @version 1
  10. // @grant none
  11. // @description Script that visually merges the same event on multiple Google Calendars into one event.
  12. // ==/UserScript==
  13.  
  14. 'use strict';
  15.  
  16. function EventMerger(key_function, clean_up_function) {
  17. this.makeKey = key_function;
  18. this.cleanUp = clean_up_function;
  19. }
  20.  
  21. EventMerger.prototype = {
  22. getEventSets: function ($events) {
  23. var event_sets = {},
  24. makeKey = this.makeKey;
  25. $events.each(function () {
  26. var $event = $(this),
  27. key = makeKey($event).replace(/\s/g, '');
  28. event_sets[key] = event_sets[key] || [];
  29. event_sets[key].push($event);
  30. });
  31. return event_sets;
  32. },
  33. makeAltTextColors: function ($element, colors) {
  34. $element.prepend(" ");
  35. $element.find(".color-bar").remove();
  36. $.each(colors.reverse(), function (i, color) {
  37. $element.prepend($("<span>")
  38. .addClass('color-bar')
  39. .css({
  40. 'background-color': color,
  41. 'width': '4px',
  42. 'height': '12px',
  43. 'display': 'inline-block'
  44. }));
  45. });
  46. },
  47. makeStripes: function ($element, colors) {
  48. var gradient = "repeating-linear-gradient( 45deg,",
  49. pos = 0;
  50. $.each(colors, function (i, color) {
  51. gradient += color + " " + pos + "px,";
  52. pos += 10;
  53. gradient += color + " " + pos + "px,";
  54. });
  55. gradient = gradient.slice(0, -1);
  56. gradient += ")";
  57. $element.css('background-image', gradient);
  58. },
  59. mergeEvents: function (name, event_set) {
  60. if (event_set.length > 1) {
  61.  
  62. var background = $(event_set[0]).css('background-color');
  63. // If the background is transparent, use the text color
  64. var style_type = background.indexOf("rgba") == -1 ?
  65. 'background-color' : 'color';
  66.  
  67. var colors = $.map(event_set, function (event) {
  68. return $(event).css(style_type);
  69. });
  70.  
  71. var keep = event_set.shift();
  72. $(event_set).each(function () {
  73. $(this).parent().css('visibility', 'hidden');
  74. $(this).parent().find('*').css('visibility', 'hidden');
  75. });
  76.  
  77. if (style_type == 'background-color') {
  78. this.makeStripes(keep, colors);
  79. } else {
  80. this.makeAltTextColors(keep, colors);
  81. }
  82. this.cleanUp && this.cleanUp(keep);
  83. }
  84. },
  85. mergeSets: function ($events) {
  86. var sets = this.getEventSets($events);
  87. $.each(sets, $.proxy(this.mergeEvents, this));
  88. }
  89. };
  90.  
  91. /*****************************************************************************/
  92.  
  93. function cleanEventTitle(event_title) {
  94. return event_title.trim()
  95. .replace(/\(.*\)$/, '') // Remove parentheticals at end for 1:1 lab
  96. .replace(/\W/g, ''); // Remove non-ascii chars
  97. }
  98.  
  99. function weekTimedEventKey($event) {
  100. var event_name = cleanEventTitle($event.find('dd .evt-lk').text()),
  101. event_time = $event.find('dt').text(),
  102. col = $event.parents('.tg-col-eventwrapper').attr('id');
  103. return event_name + event_time + col;
  104. }
  105.  
  106. function tableEventKey($event) {
  107. var event_name = cleanEventTitle($event.text()),
  108. $td = $event.parents('td'),
  109. days = $td.attr("colspan") || 1,
  110. col = $td.position().left;
  111. return event_name + ":" + col + ":" + days;
  112. }
  113.  
  114. function monthAllDayEventKey($event) {
  115. var row = $event.parents('.month-row').index();
  116. return tableEventKey($event) + ":" + row;
  117. }
  118.  
  119. function monthTimedEventKey($event) {
  120. var time = $event.find('.te-t').text();
  121. return monthAllDayEventKey($event) + time;
  122. }
  123.  
  124. function cleanUp($event) {
  125. var chip = $event.parents('.chip');
  126. if (chip[0]) {
  127. var left = Number(chip[0].style.left.replace(/%/g, ''));
  128. chip.css('width', 100 - (isNaN(left) ? 0 : left) + "%");
  129. }
  130. }
  131.  
  132. var weekTimed = new EventMerger(weekTimedEventKey, cleanUp),
  133. weekAllDay = new EventMerger(tableEventKey),
  134. monthTimed = new EventMerger(monthTimedEventKey),
  135. monthAllDay = new EventMerger(monthAllDayEventKey);
  136.  
  137. chrome.runtime.sendMessage({}, function(response) {
  138. if (response.enabled) {
  139. var merging_main = false;
  140. $(document).on("DOMNodeInserted", "#gridcontainer", function () {
  141. if (!merging_main) {
  142. merging_main = true;
  143. var grid_container = $(this);
  144. weekTimed.mergeSets(grid_container.find('dl'));
  145. weekAllDay.mergeSets(grid_container.find(".wk-weektop .rb-n"));
  146. monthTimed.mergeSets(grid_container.find(".te"));
  147. monthAllDay.mergeSets(grid_container.find(".mv-event-container .rb-n"));
  148. merging_main = false;
  149. }
  150. });
  151.  
  152. var merging_find_time = false;
  153. $(document).on("DOMNodeInserted", "#scTgTable", function (e) {
  154. if (!merging_find_time) {
  155. merging_find_time = true;
  156. var find_time_container = $(this);
  157. weekTimed.mergeSets(find_time_container.find('dl'));
  158. weekAllDay.mergeSets(find_time_container.find(".rb-n"));
  159. merging_find_time = false;
  160. }
  161. });
  162. }
  163. });

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址