Event Merge for Google Calendar™ (by @imightbeAmy)

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

当前为 2018-02-17 提交的版本,查看 最新版本

  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. const merge = () => {
  17. const stripesGradient = (colors) => {
  18. let gradient = "repeating-linear-gradient( 45deg,";
  19. let pos = 0;
  20.  
  21. colors.forEach(color => {
  22. gradient += color + " " + pos + "px,";
  23. pos += 10;
  24. gradient += color + " " + pos + "px,";
  25. });
  26. gradient = gradient.slice(0, -1);
  27. gradient += ")";
  28. return gradient;
  29. };
  30.  
  31. const grids = document.querySelectorAll("[role=\"main\"] [role=\"grid\"] > [role=\"presentation\"]");
  32. const mainCalender = Array.from(grids).find(grid => typeof grid.dataset.isColumnViewContext === "undefined");
  33.  
  34. const eventSets = {};
  35. const days = mainCalender.querySelectorAll("[role=\"gridcell\"]");
  36. days.forEach((day, index) => {
  37. const events = Array.from(day.querySelectorAll("[role=\"button\"]"));
  38. events.forEach(event => {
  39. let eventKey = event.querySelector("div:nth-child(2)").textContent.replace(/\\s+/g,"");
  40. eventKey = index + eventKey;
  41. eventSets[eventKey] = eventSets[eventKey] || [];
  42. eventSets[eventKey].push(event);
  43. });
  44. });
  45.  
  46. Object.values(eventSets)
  47. .filter(events => events.length > 1)
  48. .forEach(events => {
  49. const colors = events.map(event => event.style.backgroundColor || event.style.borderColor);
  50. const gradient = stripesGradient(colors);
  51.  
  52. const eventToKeep = events.shift();
  53. eventToKeep.style.backgroundImage = gradient;
  54.  
  55. let width = Number(events[0].style.width.replace(/%/g, ""));
  56. if (!isNaN(width)) {
  57. width = width * (events.length + 1);
  58. width = Math.min(width, 100);
  59. eventToKeep.style.width = width + "%";
  60. }
  61.  
  62. events.forEach(event => {
  63. event.style.visibility = "hidden";
  64. });
  65. });
  66. }
  67.  
  68. chrome.runtime.sendMessage({}, function(response) {
  69. if (response.enabled) {
  70. $(document).ready(merge);
  71. }
  72. });