{"id":22555,"date":"2025-07-24T23:41:49","date_gmt":"2025-07-24T14:41:49","guid":{"rendered":"https:\/\/84office.jp\/?p=22555"},"modified":"2025-07-24T23:41:50","modified_gmt":"2025-07-24T14:41:50","slug":"google-calendar-free-time-extraction","status":"publish","type":"post","link":"https:\/\/84office.jp\/en\/google-calendar-free-time-extraction\/","title":{"rendered":"How to Find Common Free Time in Google Calendar: Manage Shared Schedules with Google Apps Script"},"content":{"rendered":"<div class=\"codoc-evacuations\" style=\"display:none;\" data-shortcode=\"\"><\/div>\n<p class=\"wp-block-paragraph\">Have you ever found it time-consuming to search for common free time when coordinating schedules within your team?<br>Even though Google Calendar allows you to view multiple calendars at once, comparing everyone\u2019s schedules side by side can quickly become confusing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To solve this, I\u2019ll show you how to use Google Apps Script to automatically extract shared free time slots from each member\u2019s Google Calendar and manage them in a Google Spreadsheet.<\/p>\n\n\n\n<p class=\"u-mb-ctrl u-mb-40 wp-block-paragraph\">With this method, scheduling meetings and coordinating team events becomes much easier and more efficient.<\/p>\n\n\n\n<div class=\"wp-block-group u-mb-ctrl u-mb-50 has-swl-pale-03-background-color has-background\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"wp-block-paragraph\">If you want to save even more time, I also offer a ready-to-use, pre-configured template (paid) in a separate article\u2014perfect for those who want to get started right away.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For more details, check out the article below.<\/p>\n\n\n<div class=\"swell-block-postLink\">\t\t\t<a href=\"https:\/\/84office.jp\/google-calendar-free-time-template\/\" class=\"c-blogLink -internal\" data-style=\"text\" target=\"_blank\" rel=\"noopener noreferrer\">\n\t\t\t\t<!-- <i class=\"c-blogLink__icon icon-link\" role=\"presentation\"><\/i> -->\n\t\t\t\t<span class=\"c-blogLink__icon\">\n\t\t\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"swl-svg-link __svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 48 48\" role=\"img\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M21.2 30.2c-.5 0-1-.2-1.4-.6l-.7-.7c-2.3-2.3-3.5-5.3-3.5-8.5s1.2-6.2 3.5-8.5l7.1-7.1c2.3-2.3 5.3-3.5 8.5-3.5s6.2 1.2 8.5 3.5c4.7 4.7 4.7 12.3 0 17l-3.5 3.5c-.8.8-2 .8-2.8 0-.8-.8-.8-2 0-2.8l3.5-3.5c3.1-3.1 3.1-8.2 0-11.3-1.5-1.5-3.5-2.3-5.7-2.3-2.1 0-4.2.8-5.7 2.3l-7.1 7.1c-1.5 1.5-2.3 3.5-2.3 5.7s.8 4.2 2.3 5.7l.7.7c.8.8.8 2 0 2.8-.4.3-.9.5-1.4.5z\" \/><path d=\"M13.4 46.6c-3.1 0-6.1-1.2-8.5-3.5-2.3-2.3-3.5-5.3-3.5-8.5s1.2-6.2 3.5-8.5l3.5-3.5c.8-.8 2-.8 2.8 0 .8.8.8 2 0 2.8l-3.5 3.5c-1.5 1.5-2.3 3.5-2.3 5.7 0 2.1.8 4.2 2.3 5.7 3.1 3.1 8.2 3.1 11.3 0l7.1-7.1c1.5-1.5 2.3-3.5 2.3-5.7 0-2.1-.8-4.2-2.3-5.7l-.7-.7c-.8-.8-.8-2 0-2.8.8-.8 2-.8 2.8 0l.7.7c2.3 2.3 3.5 5.3 3.5 8.5s-1.2 6.2-3.5 8.5l-7.1 7.1c-2.3 2.3-5.3 3.5-8.4 3.5z\" \/><\/svg>\t\t\t\t<\/span>\n\t\t\t\t<span class=\"c-blogLink__text\">Google\u30ab\u30ec\u30f3\u30c0\u30fc\u7a7a\u304d\u6642\u9593\u62bd\u51fa\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\uff5c\u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8 \u00d7 GAS<\/span>\n\t\t\t<\/a>\n\t\t<\/div><\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Example Output<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large is-resized is-style-shadow\"><img decoding=\"async\" width=\"1024\" height=\"711\" src=\"https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-284-1024x711.png\" alt=\"\" class=\"wp-image-22562\" style=\"width:632px;height:auto\" srcset=\"https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-284-1024x711.png 1024w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-284-300x208.png 300w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-284-768x533.png 768w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-284.png 1069w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"has-border -border02 u-mb-ctrl u-mb-40 has-swl-pale-03-background-color has-background wp-block-paragraph\">The script will display a list of shared free time slots within your selected date range.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For each day between your specified start and end dates, the spreadsheet will show the common available time slots for all participants.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Each row contains the date and a list of free time periods when everyone is available, making it easy to see which times do not overlap with any existing events across multiple Google Calendars.<\/p>\n\n\n\n<p class=\"u-mb-ctrl u-mb-50 wp-block-paragraph\">This allows you to quickly find common availability for meetings or team appointments, streamlining your scheduling process.<\/p>\n\n\n\n<p class=\"is-style-bg_stripe u-mb-ctrl u-mb-60 wp-block-paragraph\">You can also customize the interval (in minutes) for checking available time slots by entering a value in cell B6. In the example shown, free time is displayed in 20-minute increments.<\/p>\n\n\n\n<h2 class=\"wp-block-heading u-mb-ctrl u-mb-30\">What You Need to Prepare<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before creating the Google Apps Script, you\u2019ll need to complete the following two setup steps.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you\u2019ve already done these, feel free to move on to the next section.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Setting Google Calendar Sharing Permissions<\/h3>\n\n\n\n<div class=\"swell-block-accordion u-mb-ctrl u-mb-60\">\n<details class=\"swell-block-accordion__item\" data-swl-acc=\"wrapper\"><summary class=\"swell-block-accordion__title\" data-swl-acc=\"header\"><span class=\"swell-block-accordion__label\">How to Share Your Google Calendar<\/span><span class=\"swell-block-accordion__icon c-switchIconBtn\" data-swl-acc=\"icon\" aria-hidden=\"true\" data-opened=\"false\"><i class=\"__icon--closed icon-caret-down\"><\/i><i class=\"__icon--opened icon-caret-up\"><\/i><\/span><\/summary><div class=\"swell-block-accordion__body\" data-swl-acc=\"body\"><div class=\"wp-block-image is-style-shadow u-mb-ctrl u-mb-40\">\n<figure class=\"alignleft size-full is-resized\"><img decoding=\"async\" width=\"840\" height=\"616\" src=\"https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-243.png\" alt=\"\" class=\"wp-image-22510\" style=\"width:508px;height:auto\" srcset=\"https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-243.png 840w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-243-300x220.png 300w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-243-768x563.png 768w\" sizes=\"(max-width: 840px) 100vw, 840px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"u-mb-ctrl u-mb-60 wp-block-paragraph\">Open <a href=\"https:\/\/calendar.google.com\/calendar\/u\/0\/r\" target=\"_blank\" rel=\"noreferrer noopener\">Google Calendar<\/a> and click the settings icon in the top right corner.<\/p>\n\n\n<div class=\"wp-block-image is-style-shadow u-mb-ctrl u-mb-40\">\n<figure class=\"alignleft size-full is-resized\"><img decoding=\"async\" width=\"584\" height=\"578\" src=\"https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-245.png\" alt=\"\" class=\"wp-image-22512\" style=\"width:326px;height:auto\" srcset=\"https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-245.png 584w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-245-300x297.png 300w\" sizes=\"(max-width: 584px) 100vw, 584px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"u-mb-ctrl u-mb-50 wp-block-paragraph\">In the left-hand menu, select Settings for My Calendars and click on the calendar you want to use.<\/p>\n\n\n<div class=\"wp-block-image is-style-shadow u-mb-ctrl u-mb-40\">\n<figure class=\"alignleft size-large\"><img decoding=\"async\" width=\"1024\" height=\"425\" src=\"https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-246-1024x425.png\" alt=\"\" class=\"wp-image-22513\" srcset=\"https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-246-1024x425.png 1024w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-246-300x124.png 300w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-246-768x318.png 768w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-246.png 1360w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Scroll down on the calendar settings page to find Share with specific people or groups.<\/p>\n\n\n\n<p class=\"u-mb-ctrl u-mb-60 wp-block-paragraph\">Click Add people or groups within this section.<\/p>\n\n\n<div class=\"wp-block-image is-style-shadow u-mb-ctrl u-mb-40\">\n<figure class=\"alignleft size-full is-resized\"><img decoding=\"async\" width=\"932\" height=\"522\" src=\"https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-247.png\" alt=\"\" class=\"wp-image-22514\" style=\"width:491px;height:auto\" srcset=\"https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-247.png 932w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-247-300x168.png 300w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-247-768x430.png 768w\" sizes=\"(max-width: 932px) 100vw, 932px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"u-mb-ctrl u-mb-60 wp-block-paragraph\">Set the permission level to See all event details and share the calendar.<\/p>\n\n\n<div class=\"wp-block-image is-style-shadow u-mb-ctrl u-mb-40\">\n<figure class=\"alignleft size-full is-resized\"><img decoding=\"async\" width=\"478\" height=\"420\" src=\"https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-249.png\" alt=\"\" class=\"wp-image-22516\" style=\"width:309px;height:auto\" srcset=\"https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-249.png 478w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-249-300x264.png 300w\" sizes=\"(max-width: 478px) 100vw, 478px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"u-mb-ctrl u-mb-30 wp-block-paragraph\">The shared calendar will be added under Other calendars in Google Calendar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Tip:<\/strong><br>If you don\u2019t see the shared calendar after it\u2019s been shared, try the following:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Go to <strong>Other calendars<\/strong> \u2192 <strong>+<\/strong> \u2192 <strong>Subscribe to calendar<\/strong> \u2192 <strong>Add calendar<\/strong> and enter the Calendar ID.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Click the sharing notification link you received via email.<\/p>\n<\/div><\/details>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\">How to Find Your Google Calendar ID<\/h3>\n\n\n\n<div class=\"swell-block-accordion u-mb-ctrl u-mb-60\">\n<details class=\"swell-block-accordion__item\" data-swl-acc=\"wrapper\"><summary class=\"swell-block-accordion__title\" data-swl-acc=\"header\"><span class=\"swell-block-accordion__label\">How to Find Your Google Calendar ID<\/span><span class=\"swell-block-accordion__icon c-switchIconBtn\" data-swl-acc=\"icon\" aria-hidden=\"true\" data-opened=\"false\"><i class=\"__icon--closed icon-caret-down\"><\/i><i class=\"__icon--opened icon-caret-up\"><\/i><\/span><\/summary><div class=\"swell-block-accordion__body\" data-swl-acc=\"body\"><div class=\"wp-block-image is-style-shadow u-mb-ctrl u-mb-40\">\n<figure class=\"alignleft size-full is-resized\"><img decoding=\"async\" width=\"840\" height=\"616\" src=\"https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-243.png\" alt=\"\" class=\"wp-image-22510\" style=\"width:508px;height:auto\" srcset=\"https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-243.png 840w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-243-300x220.png 300w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-243-768x563.png 768w\" sizes=\"(max-width: 840px) 100vw, 840px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"u-mb-ctrl u-mb-60 wp-block-paragraph\">Open <a href=\"https:\/\/calendar.google.com\/calendar\/u\/0\/r\" target=\"_blank\" rel=\"noreferrer noopener\">Google Calendar<\/a> and click the settings icon in the top right corner.<\/p>\n\n\n<div class=\"wp-block-image is-style-shadow u-mb-ctrl u-mb-40\">\n<figure class=\"alignleft size-full is-resized\"><img decoding=\"async\" width=\"584\" height=\"578\" src=\"https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-245.png\" alt=\"\" class=\"wp-image-22512\" style=\"width:326px;height:auto\" srcset=\"https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-245.png 584w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-245-300x297.png 300w\" sizes=\"(max-width: 584px) 100vw, 584px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"u-mb-ctrl u-mb-50 wp-block-paragraph\">In the left-hand menu, select Settings for My Calendars and choose the calendar you want to use.<\/p>\n\n\n<div class=\"wp-block-image is-style-shadow u-mb-ctrl u-mb-40\">\n<figure class=\"alignleft size-large\"><img decoding=\"async\" width=\"1024\" height=\"569\" src=\"https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-252-1024x569.png\" alt=\"\" class=\"wp-image-22519\" srcset=\"https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-252-1024x569.png 1024w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-252-300x167.png 300w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-252-768x427.png 768w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-252.png 1274w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">On the calendar settings page, scroll down to find the Calendar ID section.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The Calendar ID is usually in the format <code>xxx@gmail.com<\/code> or <code>xxxx@group.calendar.google.com<\/code>.<\/p>\n<\/div><\/details>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading u-mb-ctrl u-mb-30\">Step-by-Step Instructions<\/h2>\n\n\n\n<div class=\"swell-block-step u-mb-ctrl u-mb-60\" data-num-style=\"circle\">\n<div class=\"swell-block-step__item\"><div class=\"swell-block-step__number u-bg-main\"><span class=\"__label\">STEP<\/span><\/div><div class=\"swell-block-step__title u-fz-l\">Prepare Your Spreadsheet<\/div><div class=\"swell-block-step__body\"><div class=\"wp-block-image is-style-shadow u-mb-ctrl u-mb-40\">\n<figure class=\"alignleft size-full is-resized\"><img decoding=\"async\" width=\"852\" height=\"369\" src=\"https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-286.png\" alt=\"\" class=\"wp-image-22564\" style=\"width:533px;height:auto\" srcset=\"https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-286.png 852w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-286-300x130.png 300w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-286-768x333.png 768w\" sizes=\"(max-width: 852px) 100vw, 852px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"u-mb-ctrl u-mb-40 wp-block-paragraph\">Open a new Google Spreadsheet and enter the following:<\/p>\n\n\n\n<figure class=\"wp-block-table is-all-centered u-mb-ctrl u-mb-40\"><table><thead style=\"--thead-color--bg:var(--color_pale03);--thead-color--txt:var(--swl-text_color--black)\"><tr><th colspan=\"2\">Input Fields<\/th><\/tr><\/thead><tbody><tr><td>B1<\/td><td>Google Calendar ID(s) you want to check<br>(If you have multiple calendars, enter the IDs from B1 to the right)<\/td><\/tr><tr><td>B2<\/td><td>Start date of the period to check<\/td><\/tr><tr><td>B3<\/td><td>End date of the period to check<\/td><\/tr><tr><td>B4<\/td><td>Start time of available slots<\/td><\/tr><tr><td>B5<\/td><td>End time of available slots<\/td><\/tr><tr><td>B6<\/td><td>Time interval (minutes)<br>(For example, entering \u201c30\u201d will display available time slots in 30-minute increments)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"u-mb-ctrl u-mb-40 wp-block-paragraph\">For this example, we\u2019ll name the sheet Check Availability.<br>(The script will refer to this sheet by name.)<\/p>\n\n\n\n<ul class=\"wp-block-list is-style-big_icon_caution\">\n<li>Enter the start time (cell B4) and end time (cell B5) for the free time slots as text strings (e.g., 09:00), not as numbers or Google Sheets\u2019 time format.<\/li>\n\n\n\n<li>If you use only numbers or the default time format, the script may not read them correctly.<\/li>\n<\/ul>\n<\/div><\/div>\n\n\n\n<div class=\"swell-block-step__item\"><div class=\"swell-block-step__number u-bg-main\"><span class=\"__label\">STEP<\/span><\/div><div class=\"swell-block-step__title u-fz-l\">Open the Apps Script Editor<\/div><div class=\"swell-block-step__body\"><div class=\"wp-block-image u-mb-ctrl u-mb-40\">\n<figure class=\"alignleft size-full is-resized\"><img decoding=\"async\" width=\"933\" height=\"591\" src=\"https:\/\/84office.jp\/wp-content\/uploads\/2024\/12\/98efceb7a335447039dff05eb8d70d3d.png\" alt=\"\" class=\"wp-image-16537\" style=\"width:447px;height:auto\" srcset=\"https:\/\/84office.jp\/wp-content\/uploads\/2024\/12\/98efceb7a335447039dff05eb8d70d3d.png 933w, https:\/\/84office.jp\/wp-content\/uploads\/2024\/12\/98efceb7a335447039dff05eb8d70d3d-300x190.png 300w, https:\/\/84office.jp\/wp-content\/uploads\/2024\/12\/98efceb7a335447039dff05eb8d70d3d-768x486.png 768w\" sizes=\"(max-width: 933px) 100vw, 933px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Open your Google Spreadsheet, click on \u201cExtensions\u201d in the menu, and select \u201cApps Script\u201d to open the editor.<\/p>\n<\/div><\/div>\n\n\n\n<div class=\"swell-block-step__item\"><div class=\"swell-block-step__number u-bg-main\"><span class=\"__label\">STEP<\/span><\/div><div class=\"swell-block-step__title u-fz-l\"><strong><strong><strong>Create the Script<\/strong><\/strong><\/strong><\/div><div class=\"swell-block-step__body\"><div class=\"wp-block-image u-mb-ctrl u-mb-40 is-style-shadow\">\n<figure class=\"alignleft size-large is-resized\"><img decoding=\"async\" width=\"1024\" height=\"472\" src=\"https:\/\/84office.jp\/wp-content\/uploads\/2024\/11\/e5e524d3405a7a1c3cfaaf3f2b1cc662-1024x472.png\" alt=\"\" class=\"wp-image-16191\" style=\"width:684px;height:auto\" srcset=\"https:\/\/84office.jp\/wp-content\/uploads\/2024\/11\/e5e524d3405a7a1c3cfaaf3f2b1cc662-1024x472.png 1024w, https:\/\/84office.jp\/wp-content\/uploads\/2024\/11\/e5e524d3405a7a1c3cfaaf3f2b1cc662-300x138.png 300w, https:\/\/84office.jp\/wp-content\/uploads\/2024\/11\/e5e524d3405a7a1c3cfaaf3f2b1cc662-768x354.png 768w, https:\/\/84office.jp\/wp-content\/uploads\/2024\/11\/e5e524d3405a7a1c3cfaaf3f2b1cc662.png 1387w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">function myFunction(){<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<p class=\"u-mb-ctrl u-mb-40 wp-block-paragraph\">is included from the beginning, so delete it and paste the previous script.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>function findCommonFreeTime() {\n  const sheetName = \"Check Availability\"; \/\/ Sheet name\n  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);\n\n  if (!sheet) {\n    Logger.log(`Error: Sheet \"${sheetName}\" not found. Please create the sheet in your spreadsheet.`);\n    return;\n  }\n\n  const startDate = new Date(sheet.getRange(\"B2\").getValue()); \/\/ Start date\n  const endDate = new Date(sheet.getRange(\"B3\").getValue());   \/\/ End date\n  \/\/ The interval is no longer needed for splitting free times, so it's not used below\n  \/\/ const interval = parseInt(sheet.getRange(\"B6\").getValue()); \n\n  const calendarIds = sheet.getRange(\"B1:1\").getValues()&#91;0&#93;.filter(id => id);\n  if (calendarIds.length === 0) {\n    Logger.log(\"Error: No calendar ID specified. Please enter the calendar IDs starting from cell B1.\");\n    return;\n  }\n\n  \/\/ Get start\/end time from B4\/B5\n  let startTimeStr = sheet.getRange(\"B4\").getValue();\n  let endTimeStr = sheet.getRange(\"B5\").getValue();\n  if (startTimeStr instanceof Date) {\n    startTimeStr = Utilities.formatDate(startTimeStr, Session.getScriptTimeZone(), \"H:mm\");\n  }\n  if (endTimeStr instanceof Date) {\n    endTimeStr = Utilities.formatDate(endTimeStr, Session.getScriptTimeZone(), \"H:mm\");\n  }\n\n  let startHour = 0, startMinute = 0, endHour = 23, endMinute = 59;\n  if (startTimeStr) {\n    const &#91;sHour, sMinute&#93; = startTimeStr.split(\":\").map(Number);\n    startHour = sHour;\n    startMinute = sMinute || 0;\n  }\n  if (endTimeStr) {\n    const &#91;eHour, eMinute&#93; = endTimeStr.split(\":\").map(Number);\n    endHour = eHour;\n    endMinute = eMinute || 0;\n  }\n\n  const weekdays = &#91;\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"&#93;;\n  const freeTimeSlots = [];\n\n  for (let day = new Date(startDate); day &lt;= endDate; day.setDate(day.getDate() + 1)) {\n    const dayString = Utilities.formatDate(new Date(day), Session.getScriptTimeZone(), \"MM\/dd\/yyyy\");\n    const weekdayString = `(${weekdays&#91;day.getDay()&#93;})`;\n    const formattedDate = `${dayString} ${weekdayString}`;\n\n    \/\/ Set daily start\/end time\n    const dayStart = new Date(day);\n    dayStart.setHours(startHour, startMinute, 0, 0);\n    const dayEnd = new Date(day);\n    dayEnd.setHours(endHour, endMinute, 59, 999);\n\n    \/\/ 1. Gather all events from all calendars into one array\n    let allEvents = [];\n    calendarIds.forEach(calendarId => {\n      const calendar = CalendarApp.getCalendarById(calendarId);\n      if (!calendar) return;\n      const events = calendar.getEvents(dayStart, dayEnd);\n      events.forEach(event => {\n        allEvents.push({\n          start: event.getStartTime(),\n          end: event.getEndTime()\n        });\n      });\n    });\n\n    \/\/ 2. Sort events by start time\n    allEvents.sort((a, b) => a.start - b.start);\n\n    \/\/ 3. Merge overlapping events (to get ALL busy periods)\n    let mergedEvents = [];\n    allEvents.forEach(event => {\n      if (!mergedEvents.length) {\n        mergedEvents.push({ start: event.start, end: event.end });\n      } else {\n        let last = mergedEvents&#91;mergedEvents.length - 1&#93;;\n        if (event.start &lt;= last.end) {\n          \/\/ Overlapping\n          last.end = new Date(Math.max(last.end.getTime(), event.end.getTime()));\n        } else {\n          mergedEvents.push({ start: event.start, end: event.end });\n        }\n      }\n    });\n\n    \/\/ 4. Calculate free time slots between merged busy periods\n    let freeTimes = [];\n    let prevEnd = new Date(dayStart);\n\n    mergedEvents.forEach(event => {\n      if (event.start > prevEnd) {\n        freeTimes.push({ start: new Date(prevEnd), end: new Date(event.start) });\n      }\n      prevEnd = new Date(Math.max(prevEnd.getTime(), event.end.getTime()));\n    });\n\n    if (prevEnd &lt; dayEnd) {\n      freeTimes.push({ start: new Date(prevEnd), end: new Date(dayEnd) });\n    }\n\n    \/\/ 5. Output each free time slot as a single line (not split by interval)\n    freeTimes.forEach(time => {\n      const startStr = Utilities.formatDate(time.start, Session.getScriptTimeZone(), \"H:mm\");\n      const endStr = Utilities.formatDate(time.end, Session.getScriptTimeZone(), \"H:mm\");\n      freeTimeSlots.push(&#91;formattedDate, `${startStr} - ${endStr}`&#93;);\n    });\n  }\n\n  \/\/ Output to sheet\n  sheet.getRange(\"A9:B\").clear();\n\n  if (freeTimeSlots.length === 0) {\n    sheet.getRange(\"A9:B9\").setValues([&#91;\"No available time slots found.\", \"\"&#93;]);\n  } else {\n    const outputRange = sheet.getRange(9, 1, freeTimeSlots.length, 2);\n    outputRange.setValues(freeTimeSlots);\n  }\n\n  \/\/ Header styling\n  const headerRange = sheet.getRange(\"A8:B8\");\n  headerRange.setValues([&#91;\"Date\", \"Free Time\"&#93;]);\n  headerRange.setHorizontalAlignment(\"center\");\n  headerRange.setBackground(\"#e6f4ea\");\n  const timeColumnRange = sheet.getRange(9, 2, freeTimeSlots.length, 1);\n  timeColumnRange.setHorizontalAlignment(\"right\");\n\n  Logger.log(`Common free time slots have been output as single intervals per row.`);\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #66D9EF; font-style: italic\">function<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">findCommonFreeTime<\/span><span style=\"color: #F8F8F2\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> sheetName <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;Check Availability&quot;<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #88846F\">\/\/ Sheet name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> sheet <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> SpreadsheetApp.<\/span><span style=\"color: #A6E22E\">getActiveSpreadsheet<\/span><span style=\"color: #F8F8F2\">().<\/span><span style=\"color: #A6E22E\">getSheetByName<\/span><span style=\"color: #F8F8F2\">(sheetName);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (<\/span><span style=\"color: #F92672\">!<\/span><span style=\"color: #F8F8F2\">sheet) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    Logger.<\/span><span style=\"color: #A6E22E\">log<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">`Error: Sheet &quot;<\/span><span style=\"color: #F92672\">${<\/span><span style=\"color: #F8F8F2\">sheetName<\/span><span style=\"color: #F92672\">}<\/span><span style=\"color: #E6DB74\">&quot; not found. Please create the sheet in your spreadsheet.`<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">return<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> startDate <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(sheet.<\/span><span style=\"color: #A6E22E\">getRange<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;B2&quot;<\/span><span style=\"color: #F8F8F2\">).<\/span><span style=\"color: #A6E22E\">getValue<\/span><span style=\"color: #F8F8F2\">()); <\/span><span style=\"color: #88846F\">\/\/ Start date<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> endDate <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(sheet.<\/span><span style=\"color: #A6E22E\">getRange<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;B3&quot;<\/span><span style=\"color: #F8F8F2\">).<\/span><span style=\"color: #A6E22E\">getValue<\/span><span style=\"color: #F8F8F2\">());   <\/span><span style=\"color: #88846F\">\/\/ End date<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #88846F\">\/\/ The interval is no longer needed for splitting free times, so it&#39;s not used below<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #88846F\">\/\/ const interval = parseInt(sheet.getRange(&quot;B6&quot;).getValue()); <\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> calendarIds <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> sheet.<\/span><span style=\"color: #A6E22E\">getRange<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;B1:1&quot;<\/span><span style=\"color: #F8F8F2\">).<\/span><span style=\"color: #A6E22E\">getValues<\/span><span style=\"color: #F8F8F2\">()&#91;<\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\">&#93;.<\/span><span style=\"color: #A6E22E\">filter<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FD971F; font-style: italic\">id<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">=&gt;<\/span><span style=\"color: #F8F8F2\"> id);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (calendarIds.length <\/span><span style=\"color: #F92672\">===<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    Logger.<\/span><span style=\"color: #A6E22E\">log<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;Error: No calendar ID specified. Please enter the calendar IDs starting from cell B1.&quot;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">return<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #88846F\">\/\/ Get start\/end time from B4\/B5<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #66D9EF; font-style: italic\">let<\/span><span style=\"color: #F8F8F2\"> startTimeStr <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> sheet.<\/span><span style=\"color: #A6E22E\">getRange<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;B4&quot;<\/span><span style=\"color: #F8F8F2\">).<\/span><span style=\"color: #A6E22E\">getValue<\/span><span style=\"color: #F8F8F2\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #66D9EF; font-style: italic\">let<\/span><span style=\"color: #F8F8F2\"> endTimeStr <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> sheet.<\/span><span style=\"color: #A6E22E\">getRange<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;B5&quot;<\/span><span style=\"color: #F8F8F2\">).<\/span><span style=\"color: #A6E22E\">getValue<\/span><span style=\"color: #F8F8F2\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (startTimeStr <\/span><span style=\"color: #F92672\">instanceof<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E; text-decoration: underline\">Date<\/span><span style=\"color: #F8F8F2\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    startTimeStr <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> Utilities.<\/span><span style=\"color: #A6E22E\">formatDate<\/span><span style=\"color: #F8F8F2\">(startTimeStr, Session.<\/span><span style=\"color: #A6E22E\">getScriptTimeZone<\/span><span style=\"color: #F8F8F2\">(), <\/span><span style=\"color: #E6DB74\">&quot;H:mm&quot;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (endTimeStr <\/span><span style=\"color: #F92672\">instanceof<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E; text-decoration: underline\">Date<\/span><span style=\"color: #F8F8F2\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    endTimeStr <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> Utilities.<\/span><span style=\"color: #A6E22E\">formatDate<\/span><span style=\"color: #F8F8F2\">(endTimeStr, Session.<\/span><span style=\"color: #A6E22E\">getScriptTimeZone<\/span><span style=\"color: #F8F8F2\">(), <\/span><span style=\"color: #E6DB74\">&quot;H:mm&quot;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #66D9EF; font-style: italic\">let<\/span><span style=\"color: #F8F8F2\"> startHour <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\">, startMinute <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\">, endHour <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">23<\/span><span style=\"color: #F8F8F2\">, endMinute <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">59<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (startTimeStr) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> &#91;sHour, sMinute&#93; <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> startTimeStr.<\/span><span style=\"color: #A6E22E\">split<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;:&quot;<\/span><span style=\"color: #F8F8F2\">).<\/span><span style=\"color: #A6E22E\">map<\/span><span style=\"color: #F8F8F2\">(Number);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    startHour <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> sHour;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    startMinute <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> sMinute <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (endTimeStr) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> &#91;eHour, eMinute&#93; <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> endTimeStr.<\/span><span style=\"color: #A6E22E\">split<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;:&quot;<\/span><span style=\"color: #F8F8F2\">).<\/span><span style=\"color: #A6E22E\">map<\/span><span style=\"color: #F8F8F2\">(Number);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    endHour <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> eHour;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    endMinute <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> eMinute <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> weekdays <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> &#91;<\/span><span style=\"color: #E6DB74\">&quot;Sun&quot;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E6DB74\">&quot;Mon&quot;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E6DB74\">&quot;Tue&quot;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E6DB74\">&quot;Wed&quot;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E6DB74\">&quot;Thu&quot;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E6DB74\">&quot;Fri&quot;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E6DB74\">&quot;Sat&quot;<\/span><span style=\"color: #F8F8F2\">&#93;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> freeTimeSlots <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> [];<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #F92672\">for<\/span><span style=\"color: #F8F8F2\"> (<\/span><span style=\"color: #66D9EF; font-style: italic\">let<\/span><span style=\"color: #F8F8F2\"> day <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(startDate); day <\/span><span style=\"color: #F92672\">&lt;=<\/span><span style=\"color: #F8F8F2\"> endDate; day.<\/span><span style=\"color: #A6E22E\">setDate<\/span><span style=\"color: #F8F8F2\">(day.<\/span><span style=\"color: #A6E22E\">getDate<\/span><span style=\"color: #F8F8F2\">() <\/span><span style=\"color: #F92672\">+<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\">)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> dayString <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> Utilities.<\/span><span style=\"color: #A6E22E\">formatDate<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(day), Session.<\/span><span style=\"color: #A6E22E\">getScriptTimeZone<\/span><span style=\"color: #F8F8F2\">(), <\/span><span style=\"color: #E6DB74\">&quot;MM\/dd\/yyyy&quot;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> weekdayString <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">`(<\/span><span style=\"color: #F92672\">${<\/span><span style=\"color: #F8F8F2\">weekdays&#91;day.<\/span><span style=\"color: #A6E22E\">getDay<\/span><span style=\"color: #F8F8F2\">()&#93;<\/span><span style=\"color: #F92672\">}<\/span><span style=\"color: #E6DB74\">)`<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> formattedDate <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">`<\/span><span style=\"color: #F92672\">${<\/span><span style=\"color: #F8F8F2\">dayString<\/span><span style=\"color: #F92672\">}<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #F92672\">${<\/span><span style=\"color: #F8F8F2\">weekdayString<\/span><span style=\"color: #F92672\">}<\/span><span style=\"color: #E6DB74\">`<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\">\/\/ Set daily start\/end time<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> dayStart <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(day);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    dayStart.<\/span><span style=\"color: #A6E22E\">setHours<\/span><span style=\"color: #F8F8F2\">(startHour, startMinute, <\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> dayEnd <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(day);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    dayEnd.<\/span><span style=\"color: #A6E22E\">setHours<\/span><span style=\"color: #F8F8F2\">(endHour, endMinute, <\/span><span style=\"color: #AE81FF\">59<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #AE81FF\">999<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\">\/\/ 1. Gather all events from all calendars into one array<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">let<\/span><span style=\"color: #F8F8F2\"> allEvents <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> [];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    calendarIds.<\/span><span style=\"color: #A6E22E\">forEach<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FD971F; font-style: italic\">calendarId<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">=&gt;<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> calendar <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> CalendarApp.<\/span><span style=\"color: #A6E22E\">getCalendarById<\/span><span style=\"color: #F8F8F2\">(calendarId);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (<\/span><span style=\"color: #F92672\">!<\/span><span style=\"color: #F8F8F2\">calendar) <\/span><span style=\"color: #F92672\">return<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> events <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> calendar.<\/span><span style=\"color: #A6E22E\">getEvents<\/span><span style=\"color: #F8F8F2\">(dayStart, dayEnd);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      events.<\/span><span style=\"color: #A6E22E\">forEach<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FD971F; font-style: italic\">event<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">=&gt;<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        allEvents.<\/span><span style=\"color: #A6E22E\">push<\/span><span style=\"color: #F8F8F2\">({<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">          start: event.<\/span><span style=\"color: #A6E22E\">getStartTime<\/span><span style=\"color: #F8F8F2\">(),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">          end: event.<\/span><span style=\"color: #A6E22E\">getEndTime<\/span><span style=\"color: #F8F8F2\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    });<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\">\/\/ 2. Sort events by start time<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    allEvents.<\/span><span style=\"color: #A6E22E\">sort<\/span><span style=\"color: #F8F8F2\">((<\/span><span style=\"color: #FD971F; font-style: italic\">a<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #FD971F; font-style: italic\">b<\/span><span style=\"color: #F8F8F2\">) <\/span><span style=\"color: #66D9EF; font-style: italic\">=&gt;<\/span><span style=\"color: #F8F8F2\"> a.start <\/span><span style=\"color: #F92672\">-<\/span><span style=\"color: #F8F8F2\"> b.start);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\">\/\/ 3. Merge overlapping events (to get ALL busy periods)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">let<\/span><span style=\"color: #F8F8F2\"> mergedEvents <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> [];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    allEvents.<\/span><span style=\"color: #A6E22E\">forEach<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FD971F; font-style: italic\">event<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">=&gt;<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (<\/span><span style=\"color: #F92672\">!<\/span><span style=\"color: #F8F8F2\">mergedEvents.length) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        mergedEvents.<\/span><span style=\"color: #A6E22E\">push<\/span><span style=\"color: #F8F8F2\">({ start: event.start, end: event.end });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      } <\/span><span style=\"color: #F92672\">else<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #66D9EF; font-style: italic\">let<\/span><span style=\"color: #F8F8F2\"> last <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> mergedEvents&#91;mergedEvents.length <\/span><span style=\"color: #F92672\">-<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\">&#93;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (event.start <\/span><span style=\"color: #F92672\">&lt;=<\/span><span style=\"color: #F8F8F2\"> last.end) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">          <\/span><span style=\"color: #88846F\">\/\/ Overlapping<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">          last.end <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(Math.<\/span><span style=\"color: #A6E22E\">max<\/span><span style=\"color: #F8F8F2\">(last.end.<\/span><span style=\"color: #A6E22E\">getTime<\/span><span style=\"color: #F8F8F2\">(), event.end.<\/span><span style=\"color: #A6E22E\">getTime<\/span><span style=\"color: #F8F8F2\">()));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        } <\/span><span style=\"color: #F92672\">else<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">          mergedEvents.<\/span><span style=\"color: #A6E22E\">push<\/span><span style=\"color: #F8F8F2\">({ start: event.start, end: event.end });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    });<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\">\/\/ 4. Calculate free time slots between merged busy periods<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">let<\/span><span style=\"color: #F8F8F2\"> freeTimes <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> [];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">let<\/span><span style=\"color: #F8F8F2\"> prevEnd <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(dayStart);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    mergedEvents.<\/span><span style=\"color: #A6E22E\">forEach<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FD971F; font-style: italic\">event<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">=&gt;<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (event.start <\/span><span style=\"color: #F92672\">&gt;<\/span><span style=\"color: #F8F8F2\"> prevEnd) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        freeTimes.<\/span><span style=\"color: #A6E22E\">push<\/span><span style=\"color: #F8F8F2\">({ start: <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(prevEnd), end: <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(event.start) });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      prevEnd <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(Math.<\/span><span style=\"color: #A6E22E\">max<\/span><span style=\"color: #F8F8F2\">(prevEnd.<\/span><span style=\"color: #A6E22E\">getTime<\/span><span style=\"color: #F8F8F2\">(), event.end.<\/span><span style=\"color: #A6E22E\">getTime<\/span><span style=\"color: #F8F8F2\">()));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    });<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (prevEnd <\/span><span style=\"color: #F92672\">&lt;<\/span><span style=\"color: #F8F8F2\"> dayEnd) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      freeTimes.<\/span><span style=\"color: #A6E22E\">push<\/span><span style=\"color: #F8F8F2\">({ start: <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(prevEnd), end: <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(dayEnd) });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #88846F\">\/\/ 5. Output each free time slot as a single line (not split by interval)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    freeTimes.<\/span><span style=\"color: #A6E22E\">forEach<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FD971F; font-style: italic\">time<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">=&gt;<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> startStr <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> Utilities.<\/span><span style=\"color: #A6E22E\">formatDate<\/span><span style=\"color: #F8F8F2\">(time.start, Session.<\/span><span style=\"color: #A6E22E\">getScriptTimeZone<\/span><span style=\"color: #F8F8F2\">(), <\/span><span style=\"color: #E6DB74\">&quot;H:mm&quot;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> endStr <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> Utilities.<\/span><span style=\"color: #A6E22E\">formatDate<\/span><span style=\"color: #F8F8F2\">(time.end, Session.<\/span><span style=\"color: #A6E22E\">getScriptTimeZone<\/span><span style=\"color: #F8F8F2\">(), <\/span><span style=\"color: #E6DB74\">&quot;H:mm&quot;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      freeTimeSlots.<\/span><span style=\"color: #A6E22E\">push<\/span><span style=\"color: #F8F8F2\">(&#91;formattedDate, <\/span><span style=\"color: #E6DB74\">`<\/span><span style=\"color: #F92672\">${<\/span><span style=\"color: #F8F8F2\">startStr<\/span><span style=\"color: #F92672\">}<\/span><span style=\"color: #E6DB74\"> - <\/span><span style=\"color: #F92672\">${<\/span><span style=\"color: #F8F8F2\">endStr<\/span><span style=\"color: #F92672\">}<\/span><span style=\"color: #E6DB74\">`<\/span><span style=\"color: #F8F8F2\">&#93;);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #88846F\">\/\/ Output to sheet<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  sheet.<\/span><span style=\"color: #A6E22E\">getRange<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;A9:B&quot;<\/span><span style=\"color: #F8F8F2\">).<\/span><span style=\"color: #A6E22E\">clear<\/span><span style=\"color: #F8F8F2\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (freeTimeSlots.length <\/span><span style=\"color: #F92672\">===<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    sheet.<\/span><span style=\"color: #A6E22E\">getRange<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;A9:B9&quot;<\/span><span style=\"color: #F8F8F2\">).<\/span><span style=\"color: #A6E22E\">setValues<\/span><span style=\"color: #F8F8F2\">([&#91;<\/span><span style=\"color: #E6DB74\">&quot;No available time slots found.&quot;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E6DB74\">&quot;&quot;<\/span><span style=\"color: #F8F8F2\">&#93;]);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  } <\/span><span style=\"color: #F92672\">else<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> outputRange <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> sheet.<\/span><span style=\"color: #A6E22E\">getRange<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #AE81FF\">9<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\">, freeTimeSlots.length, <\/span><span style=\"color: #AE81FF\">2<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    outputRange.<\/span><span style=\"color: #A6E22E\">setValues<\/span><span style=\"color: #F8F8F2\">(freeTimeSlots);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #88846F\">\/\/ Header styling<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> headerRange <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> sheet.<\/span><span style=\"color: #A6E22E\">getRange<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;A8:B8&quot;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  headerRange.<\/span><span style=\"color: #A6E22E\">setValues<\/span><span style=\"color: #F8F8F2\">([&#91;<\/span><span style=\"color: #E6DB74\">&quot;Date&quot;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E6DB74\">&quot;Free Time&quot;<\/span><span style=\"color: #F8F8F2\">&#93;]);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  headerRange.<\/span><span style=\"color: #A6E22E\">setHorizontalAlignment<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;center&quot;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  headerRange.<\/span><span style=\"color: #A6E22E\">setBackground<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;#e6f4ea&quot;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> timeColumnRange <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> sheet.<\/span><span style=\"color: #A6E22E\">getRange<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #AE81FF\">9<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #AE81FF\">2<\/span><span style=\"color: #F8F8F2\">, freeTimeSlots.length, <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  timeColumnRange.<\/span><span style=\"color: #A6E22E\">setHorizontalAlignment<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;right&quot;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  Logger.<\/span><span style=\"color: #A6E22E\">log<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">`Common free time slots have been output as single intervals per row.`<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"swell-block-accordion\">\n<details class=\"swell-block-accordion__item\" data-swl-acc=\"wrapper\"><summary class=\"swell-block-accordion__title\" data-swl-acc=\"header\"><span class=\"swell-block-accordion__label\">Script Overview<\/span><span class=\"swell-block-accordion__icon c-switchIconBtn\" data-swl-acc=\"icon\" aria-hidden=\"true\" data-opened=\"false\"><i class=\"__icon--closed icon-caret-down\"><\/i><i class=\"__icon--opened icon-caret-up\"><\/i><\/span><\/summary><div class=\"swell-block-accordion__body\" data-swl-acc=\"body\">\n<dl class=\"swell-block-dl u-mb-ctrl u-mb-50\">\n<dt class=\"swell-block-dl__dt\">Retrieving Sheet and Configuration Settings<\/dt>\n\n\n\n<dd class=\"swell-block-dl__dd\">\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>const sheetName = \"Check Availability\"; \/\/ Sheet name\nconst sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);\n\nif (!sheet) {\n  Logger.log(`Error: Sheet \"${sheetName}\" not found. Please create the sheet in your spreadsheet.`);\n  return;\n}\n\nconst startDate = new Date(sheet.getRange(\"B2\").getValue()); \/\/ Start date\nconst endDate = new Date(sheet.getRange(\"B3\").getValue());   \/\/ End date\n\n\/\/ Get values from B4 and B5 for the daily available time window\nlet startTimeStr = sheet.getRange(\"B4\").getValue();\nlet endTimeStr = sheet.getRange(\"B5\").getValue();\n\nif (startTimeStr instanceof Date) {\n  startTimeStr = Utilities.formatDate(startTimeStr, Session.getScriptTimeZone(), \"H:mm\");\n}\nif (endTimeStr instanceof Date) {\n  endTimeStr = Utilities.formatDate(endTimeStr, Session.getScriptTimeZone(), \"H:mm\");\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> sheetName <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">&quot;Check Availability&quot;<\/span><span style=\"color: #F8F8F2\">; <\/span><span style=\"color: #88846F\">\/\/ Sheet name<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> sheet <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> SpreadsheetApp.<\/span><span style=\"color: #A6E22E\">getActiveSpreadsheet<\/span><span style=\"color: #F8F8F2\">().<\/span><span style=\"color: #A6E22E\">getSheetByName<\/span><span style=\"color: #F8F8F2\">(sheetName);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (<\/span><span style=\"color: #F92672\">!<\/span><span style=\"color: #F8F8F2\">sheet) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  Logger.<\/span><span style=\"color: #A6E22E\">log<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">`Error: Sheet &quot;<\/span><span style=\"color: #F92672\">${<\/span><span style=\"color: #F8F8F2\">sheetName<\/span><span style=\"color: #F92672\">}<\/span><span style=\"color: #E6DB74\">&quot; not found. Please create the sheet in your spreadsheet.`<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #F92672\">return<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> startDate <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(sheet.<\/span><span style=\"color: #A6E22E\">getRange<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;B2&quot;<\/span><span style=\"color: #F8F8F2\">).<\/span><span style=\"color: #A6E22E\">getValue<\/span><span style=\"color: #F8F8F2\">()); <\/span><span style=\"color: #88846F\">\/\/ Start date<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> endDate <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(sheet.<\/span><span style=\"color: #A6E22E\">getRange<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;B3&quot;<\/span><span style=\"color: #F8F8F2\">).<\/span><span style=\"color: #A6E22E\">getValue<\/span><span style=\"color: #F8F8F2\">());   <\/span><span style=\"color: #88846F\">\/\/ End date<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">\/\/ Get values from B4 and B5 for the daily available time window<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF; font-style: italic\">let<\/span><span style=\"color: #F8F8F2\"> startTimeStr <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> sheet.<\/span><span style=\"color: #A6E22E\">getRange<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;B4&quot;<\/span><span style=\"color: #F8F8F2\">).<\/span><span style=\"color: #A6E22E\">getValue<\/span><span style=\"color: #F8F8F2\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF; font-style: italic\">let<\/span><span style=\"color: #F8F8F2\"> endTimeStr <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> sheet.<\/span><span style=\"color: #A6E22E\">getRange<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;B5&quot;<\/span><span style=\"color: #F8F8F2\">).<\/span><span style=\"color: #A6E22E\">getValue<\/span><span style=\"color: #F8F8F2\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (startTimeStr <\/span><span style=\"color: #F92672\">instanceof<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E; text-decoration: underline\">Date<\/span><span style=\"color: #F8F8F2\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  startTimeStr <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> Utilities.<\/span><span style=\"color: #A6E22E\">formatDate<\/span><span style=\"color: #F8F8F2\">(startTimeStr, Session.<\/span><span style=\"color: #A6E22E\">getScriptTimeZone<\/span><span style=\"color: #F8F8F2\">(), <\/span><span style=\"color: #E6DB74\">&quot;H:mm&quot;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (endTimeStr <\/span><span style=\"color: #F92672\">instanceof<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E; text-decoration: underline\">Date<\/span><span style=\"color: #F8F8F2\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  endTimeStr <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> Utilities.<\/span><span style=\"color: #A6E22E\">formatDate<\/span><span style=\"color: #F8F8F2\">(endTimeStr, Session.<\/span><span style=\"color: #A6E22E\">getScriptTimeZone<\/span><span style=\"color: #F8F8F2\">(), <\/span><span style=\"color: #E6DB74\">&quot;H:mm&quot;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">TThe script begins by retrieving the specified sheet where the settings and results are managed.<br>It checks that the sheet exists, then reads the search period (start and end dates) and the daily available time window (from cells B2, B3, B4, and B5).<br>If the start or end time is entered as a date object, it is converted to a string in &#8220;HH:mm&#8221; format for consistent processing.<\/p>\n<\/dd>\n\n\n\n<dt class=\"swell-block-dl__dt\">Retrieving Calendar IDs<\/dt>\n\n\n\n<dd class=\"swell-block-dl__dd\">\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>const calendarIds = sheet.getRange(\"B1:1\").getValues()&#91;0&#93;.filter(id => id);\n\nif (calendarIds.length === 0) {\n  Logger.log(\"Error: No calendar ID specified. Please enter the calendar IDs starting from cell B1.\");\n  return;\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> calendarIds <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> sheet.<\/span><span style=\"color: #A6E22E\">getRange<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;B1:1&quot;<\/span><span style=\"color: #F8F8F2\">).<\/span><span style=\"color: #A6E22E\">getValues<\/span><span style=\"color: #F8F8F2\">()&#91;<\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\">&#93;.<\/span><span style=\"color: #A6E22E\">filter<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FD971F; font-style: italic\">id<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">=&gt;<\/span><span style=\"color: #F8F8F2\"> id);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (calendarIds.length <\/span><span style=\"color: #F92672\">===<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  Logger.<\/span><span style=\"color: #A6E22E\">log<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;Error: No calendar ID specified. Please enter the calendar IDs starting from cell B1.&quot;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #F92672\">return<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">The script collects all Google Calendar IDs that are entered from cell B1 to the right (across row 1).<br>If no calendar IDs are specified, it outputs an error message and stops execution.<br>This ensures that the script only proceeds when there is at least one calendar to check for availability.<\/p>\n<\/dd>\n\n\n\n<dt class=\"swell-block-dl__dt\">Setting the Time Range<\/dt>\n\n\n\n<dd class=\"swell-block-dl__dd\">\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ Get values from B4 and B5 for the daily available time window\nlet startTimeStr = sheet.getRange(\"B4\").getValue();\nlet endTimeStr = sheet.getRange(\"B5\").getValue();\n\n\/\/ Convert Date objects to string if necessary\nif (startTimeStr instanceof Date) {\n  startTimeStr = Utilities.formatDate(startTimeStr, Session.getScriptTimeZone(), \"H:mm\");\n}\nif (endTimeStr instanceof Date) {\n  endTimeStr = Utilities.formatDate(endTimeStr, Session.getScriptTimeZone(), \"H:mm\");\n}\n\nlet startHour = 0, startMinute = 0, endHour = 23, endMinute = 59;\nif (startTimeStr) {\n  const &#91;sHour, sMinute&#93; = startTimeStr.split(\":\").map(Number);\n  startHour = sHour;\n  startMinute = sMinute || 0;\n}\nif (endTimeStr) {\n  const &#91;eHour, eMinute&#93; = endTimeStr.split(\":\").map(Number);\n  endHour = eHour;\n  endMinute = eMinute || 0;\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #88846F\">\/\/ Get values from B4 and B5 for the daily available time window<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF; font-style: italic\">let<\/span><span style=\"color: #F8F8F2\"> startTimeStr <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> sheet.<\/span><span style=\"color: #A6E22E\">getRange<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;B4&quot;<\/span><span style=\"color: #F8F8F2\">).<\/span><span style=\"color: #A6E22E\">getValue<\/span><span style=\"color: #F8F8F2\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF; font-style: italic\">let<\/span><span style=\"color: #F8F8F2\"> endTimeStr <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> sheet.<\/span><span style=\"color: #A6E22E\">getRange<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;B5&quot;<\/span><span style=\"color: #F8F8F2\">).<\/span><span style=\"color: #A6E22E\">getValue<\/span><span style=\"color: #F8F8F2\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">\/\/ Convert Date objects to string if necessary<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (startTimeStr <\/span><span style=\"color: #F92672\">instanceof<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E; text-decoration: underline\">Date<\/span><span style=\"color: #F8F8F2\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  startTimeStr <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> Utilities.<\/span><span style=\"color: #A6E22E\">formatDate<\/span><span style=\"color: #F8F8F2\">(startTimeStr, Session.<\/span><span style=\"color: #A6E22E\">getScriptTimeZone<\/span><span style=\"color: #F8F8F2\">(), <\/span><span style=\"color: #E6DB74\">&quot;H:mm&quot;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (endTimeStr <\/span><span style=\"color: #F92672\">instanceof<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E; text-decoration: underline\">Date<\/span><span style=\"color: #F8F8F2\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  endTimeStr <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> Utilities.<\/span><span style=\"color: #A6E22E\">formatDate<\/span><span style=\"color: #F8F8F2\">(endTimeStr, Session.<\/span><span style=\"color: #A6E22E\">getScriptTimeZone<\/span><span style=\"color: #F8F8F2\">(), <\/span><span style=\"color: #E6DB74\">&quot;H:mm&quot;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF; font-style: italic\">let<\/span><span style=\"color: #F8F8F2\"> startHour <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\">, startMinute <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\">, endHour <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">23<\/span><span style=\"color: #F8F8F2\">, endMinute <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">59<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (startTimeStr) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> &#91;sHour, sMinute&#93; <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> startTimeStr.<\/span><span style=\"color: #A6E22E\">split<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;:&quot;<\/span><span style=\"color: #F8F8F2\">).<\/span><span style=\"color: #A6E22E\">map<\/span><span style=\"color: #F8F8F2\">(Number);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  startHour <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> sHour;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  startMinute <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> sMinute <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (endTimeStr) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> &#91;eHour, eMinute&#93; <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> endTimeStr.<\/span><span style=\"color: #A6E22E\">split<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;:&quot;<\/span><span style=\"color: #F8F8F2\">).<\/span><span style=\"color: #A6E22E\">map<\/span><span style=\"color: #F8F8F2\">(Number);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  endHour <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> eHour;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  endMinute <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> eMinute <\/span><span style=\"color: #F92672\">||<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">The script retrieves the start and end times from cells B4 and B5, and converts them to a usable string format if needed.<br>If no times are entered, it defaults to 0:00 (midnight) as the start and 23:59 as the end time.<br>The script then splits these into hour and minute values for later use.<\/p>\n<\/dd>\n\n\n\n<dt class=\"swell-block-dl__dt\">Calculating Free Time for Each Date<\/dt>\n\n\n\n<dd class=\"swell-block-dl__dd\">\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>for (let day = new Date(startDate); day &lt;= endDate; day.setDate(day.getDate() + 1)) {\n  \/\/ Format date for output\n  const dayString = Utilities.formatDate(new Date(day), Session.getScriptTimeZone(), \"MM\/dd\/yyyy\");\n  const weekdayString = `(${weekdays&#91;day.getDay()&#93;})`;\n  const formattedDate = `${dayString} ${weekdayString}`;\n\n  \/\/ Set daily time window\n  const dayStart = new Date(day);\n  dayStart.setHours(startHour, startMinute, 0, 0);\n  const dayEnd = new Date(day);\n  dayEnd.setHours(endHour, endMinute, 59, 999);\n\n  \/\/ Gather and merge all calendar events\n  let allEvents = [];\n  calendarIds.forEach(calendarId => {\n    const calendar = CalendarApp.getCalendarById(calendarId);\n    if (!calendar) return;\n    const events = calendar.getEvents(dayStart, dayEnd);\n    events.forEach(event => {\n      allEvents.push({ start: event.getStartTime(), end: event.getEndTime() });\n    });\n  });\n  allEvents.sort((a, b) => a.start - b.start);\n\n  let mergedEvents = [];\n  allEvents.forEach(event => {\n    if (!mergedEvents.length) {\n      mergedEvents.push({ start: event.start, end: event.end });\n    } else {\n      let last = mergedEvents&#91;mergedEvents.length - 1&#93;;\n      if (event.start &lt;= last.end) {\n        last.end = new Date(Math.max(last.end.getTime(), event.end.getTime()));\n      } else {\n        mergedEvents.push({ start: event.start, end: event.end });\n      }\n    }\n  });\n\n  \/\/ Calculate free time slots between busy periods\n  let freeTimes = [];\n  let prevEnd = new Date(dayStart);\n\n  mergedEvents.forEach(event => {\n    if (event.start > prevEnd) {\n      freeTimes.push({ start: new Date(prevEnd), end: new Date(event.start) });\n    }\n    prevEnd = new Date(Math.max(prevEnd.getTime(), event.end.getTime()));\n  });\n\n  if (prevEnd &lt; dayEnd) {\n    freeTimes.push({ start: new Date(prevEnd), end: new Date(dayEnd) });\n  }\n\n  \/\/ Output each free time slot\n  freeTimes.forEach(time => {\n    const startStr = Utilities.formatDate(time.start, Session.getScriptTimeZone(), \"H:mm\");\n    const endStr = Utilities.formatDate(time.end, Session.getScriptTimeZone(), \"H:mm\");\n    freeTimeSlots.push(&#91;formattedDate, `${startStr} - ${endStr}`&#93;);\n  });\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F92672\">for<\/span><span style=\"color: #F8F8F2\"> (<\/span><span style=\"color: #66D9EF; font-style: italic\">let<\/span><span style=\"color: #F8F8F2\"> day <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(startDate); day <\/span><span style=\"color: #F92672\">&lt;=<\/span><span style=\"color: #F8F8F2\"> endDate; day.<\/span><span style=\"color: #A6E22E\">setDate<\/span><span style=\"color: #F8F8F2\">(day.<\/span><span style=\"color: #A6E22E\">getDate<\/span><span style=\"color: #F8F8F2\">() <\/span><span style=\"color: #F92672\">+<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\">)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #88846F\">\/\/ Format date for output<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> dayString <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> Utilities.<\/span><span style=\"color: #A6E22E\">formatDate<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(day), Session.<\/span><span style=\"color: #A6E22E\">getScriptTimeZone<\/span><span style=\"color: #F8F8F2\">(), <\/span><span style=\"color: #E6DB74\">&quot;MM\/dd\/yyyy&quot;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> weekdayString <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">`(<\/span><span style=\"color: #F92672\">${<\/span><span style=\"color: #F8F8F2\">weekdays&#91;day.<\/span><span style=\"color: #A6E22E\">getDay<\/span><span style=\"color: #F8F8F2\">()&#93;<\/span><span style=\"color: #F92672\">}<\/span><span style=\"color: #E6DB74\">)`<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> formattedDate <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E6DB74\">`<\/span><span style=\"color: #F92672\">${<\/span><span style=\"color: #F8F8F2\">dayString<\/span><span style=\"color: #F92672\">}<\/span><span style=\"color: #E6DB74\"> <\/span><span style=\"color: #F92672\">${<\/span><span style=\"color: #F8F8F2\">weekdayString<\/span><span style=\"color: #F92672\">}<\/span><span style=\"color: #E6DB74\">`<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #88846F\">\/\/ Set daily time window<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> dayStart <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(day);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  dayStart.<\/span><span style=\"color: #A6E22E\">setHours<\/span><span style=\"color: #F8F8F2\">(startHour, startMinute, <\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> dayEnd <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(day);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  dayEnd.<\/span><span style=\"color: #A6E22E\">setHours<\/span><span style=\"color: #F8F8F2\">(endHour, endMinute, <\/span><span style=\"color: #AE81FF\">59<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #AE81FF\">999<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #88846F\">\/\/ Gather and merge all calendar events<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #66D9EF; font-style: italic\">let<\/span><span style=\"color: #F8F8F2\"> allEvents <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> [];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  calendarIds.<\/span><span style=\"color: #A6E22E\">forEach<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FD971F; font-style: italic\">calendarId<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">=&gt;<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> calendar <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> CalendarApp.<\/span><span style=\"color: #A6E22E\">getCalendarById<\/span><span style=\"color: #F8F8F2\">(calendarId);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (<\/span><span style=\"color: #F92672\">!<\/span><span style=\"color: #F8F8F2\">calendar) <\/span><span style=\"color: #F92672\">return<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> events <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> calendar.<\/span><span style=\"color: #A6E22E\">getEvents<\/span><span style=\"color: #F8F8F2\">(dayStart, dayEnd);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    events.<\/span><span style=\"color: #A6E22E\">forEach<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FD971F; font-style: italic\">event<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">=&gt;<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      allEvents.<\/span><span style=\"color: #A6E22E\">push<\/span><span style=\"color: #F8F8F2\">({ start: event.<\/span><span style=\"color: #A6E22E\">getStartTime<\/span><span style=\"color: #F8F8F2\">(), end: event.<\/span><span style=\"color: #A6E22E\">getEndTime<\/span><span style=\"color: #F8F8F2\">() });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  allEvents.<\/span><span style=\"color: #A6E22E\">sort<\/span><span style=\"color: #F8F8F2\">((<\/span><span style=\"color: #FD971F; font-style: italic\">a<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #FD971F; font-style: italic\">b<\/span><span style=\"color: #F8F8F2\">) <\/span><span style=\"color: #66D9EF; font-style: italic\">=&gt;<\/span><span style=\"color: #F8F8F2\"> a.start <\/span><span style=\"color: #F92672\">-<\/span><span style=\"color: #F8F8F2\"> b.start);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #66D9EF; font-style: italic\">let<\/span><span style=\"color: #F8F8F2\"> mergedEvents <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> [];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  allEvents.<\/span><span style=\"color: #A6E22E\">forEach<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FD971F; font-style: italic\">event<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">=&gt;<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (<\/span><span style=\"color: #F92672\">!<\/span><span style=\"color: #F8F8F2\">mergedEvents.length) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      mergedEvents.<\/span><span style=\"color: #A6E22E\">push<\/span><span style=\"color: #F8F8F2\">({ start: event.start, end: event.end });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    } <\/span><span style=\"color: #F92672\">else<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      <\/span><span style=\"color: #66D9EF; font-style: italic\">let<\/span><span style=\"color: #F8F8F2\"> last <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> mergedEvents&#91;mergedEvents.length <\/span><span style=\"color: #F92672\">-<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\">&#93;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (event.start <\/span><span style=\"color: #F92672\">&lt;=<\/span><span style=\"color: #F8F8F2\"> last.end) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        last.end <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(Math.<\/span><span style=\"color: #A6E22E\">max<\/span><span style=\"color: #F8F8F2\">(last.end.<\/span><span style=\"color: #A6E22E\">getTime<\/span><span style=\"color: #F8F8F2\">(), event.end.<\/span><span style=\"color: #A6E22E\">getTime<\/span><span style=\"color: #F8F8F2\">()));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      } <\/span><span style=\"color: #F92672\">else<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        mergedEvents.<\/span><span style=\"color: #A6E22E\">push<\/span><span style=\"color: #F8F8F2\">({ start: event.start, end: event.end });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  });<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #88846F\">\/\/ Calculate free time slots between busy periods<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #66D9EF; font-style: italic\">let<\/span><span style=\"color: #F8F8F2\"> freeTimes <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> [];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #66D9EF; font-style: italic\">let<\/span><span style=\"color: #F8F8F2\"> prevEnd <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(dayStart);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  mergedEvents.<\/span><span style=\"color: #A6E22E\">forEach<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FD971F; font-style: italic\">event<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">=&gt;<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (event.start <\/span><span style=\"color: #F92672\">&gt;<\/span><span style=\"color: #F8F8F2\"> prevEnd) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      freeTimes.<\/span><span style=\"color: #A6E22E\">push<\/span><span style=\"color: #F8F8F2\">({ start: <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(prevEnd), end: <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(event.start) });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    prevEnd <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(Math.<\/span><span style=\"color: #A6E22E\">max<\/span><span style=\"color: #F8F8F2\">(prevEnd.<\/span><span style=\"color: #A6E22E\">getTime<\/span><span style=\"color: #F8F8F2\">(), event.end.<\/span><span style=\"color: #A6E22E\">getTime<\/span><span style=\"color: #F8F8F2\">()));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  });<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (prevEnd <\/span><span style=\"color: #F92672\">&lt;<\/span><span style=\"color: #F8F8F2\"> dayEnd) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    freeTimes.<\/span><span style=\"color: #A6E22E\">push<\/span><span style=\"color: #F8F8F2\">({ start: <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(prevEnd), end: <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(dayEnd) });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #88846F\">\/\/ Output each free time slot<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  freeTimes.<\/span><span style=\"color: #A6E22E\">forEach<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FD971F; font-style: italic\">time<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">=&gt;<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> startStr <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> Utilities.<\/span><span style=\"color: #A6E22E\">formatDate<\/span><span style=\"color: #F8F8F2\">(time.start, Session.<\/span><span style=\"color: #A6E22E\">getScriptTimeZone<\/span><span style=\"color: #F8F8F2\">(), <\/span><span style=\"color: #E6DB74\">&quot;H:mm&quot;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> endStr <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> Utilities.<\/span><span style=\"color: #A6E22E\">formatDate<\/span><span style=\"color: #F8F8F2\">(time.end, Session.<\/span><span style=\"color: #A6E22E\">getScriptTimeZone<\/span><span style=\"color: #F8F8F2\">(), <\/span><span style=\"color: #E6DB74\">&quot;H:mm&quot;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    freeTimeSlots.<\/span><span style=\"color: #A6E22E\">push<\/span><span style=\"color: #F8F8F2\">(&#91;formattedDate, <\/span><span style=\"color: #E6DB74\">`<\/span><span style=\"color: #F92672\">${<\/span><span style=\"color: #F8F8F2\">startStr<\/span><span style=\"color: #F92672\">}<\/span><span style=\"color: #E6DB74\"> - <\/span><span style=\"color: #F92672\">${<\/span><span style=\"color: #F8F8F2\">endStr<\/span><span style=\"color: #F92672\">}<\/span><span style=\"color: #E6DB74\">`<\/span><span style=\"color: #F8F8F2\">&#93;);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">For each day in the specified date range, the script gathers all events from all calendars, merges overlapping busy periods, and calculates the available free time slots.<br>Each common free slot is then output as a single, continuous interval.<\/p>\n<\/dd>\n\n\n\n<dt class=\"swell-block-dl__dt\">Retrieving Calendar Events and Calculating Free Time<\/dt>\n\n\n\n<dd class=\"swell-block-dl__dd\">\n<div class=\"wp-block-kevinbatdorf-code-block-pro u-mb-ctrl u-mb-30\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ Gather and merge all calendar events\nlet allEvents = [];\ncalendarIds.forEach(calendarId => {\n  const calendar = CalendarApp.getCalendarById(calendarId);\n  if (!calendar) return;\n  const events = calendar.getEvents(dayStart, dayEnd);\n  events.forEach(event => {\n    allEvents.push({ start: event.getStartTime(), end: event.getEndTime() });\n  });\n});\nallEvents.sort((a, b) => a.start - b.start);\n\n\/\/ Merge overlapping events to get busy periods\nlet mergedEvents = [];\nallEvents.forEach(event => {\n  if (!mergedEvents.length) {\n    mergedEvents.push({ start: event.start, end: event.end });\n  } else {\n    let last = mergedEvents&#91;mergedEvents.length - 1&#93;;\n    if (event.start &lt;= last.end) {\n      last.end = new Date(Math.max(last.end.getTime(), event.end.getTime()));\n    } else {\n      mergedEvents.push({ start: event.start, end: event.end });\n    }\n  }\n});\n\n\/\/ Calculate free time slots between busy periods\nlet freeTimes = [];\nlet prevEnd = new Date(dayStart);\n\nmergedEvents.forEach(event => {\n  if (event.start > prevEnd) {\n    freeTimes.push({ start: new Date(prevEnd), end: new Date(event.start) });\n  }\n  prevEnd = new Date(Math.max(prevEnd.getTime(), event.end.getTime()));\n});\n\nif (prevEnd &lt; dayEnd) {\n  freeTimes.push({ start: new Date(prevEnd), end: new Date(dayEnd) });\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #88846F\">\/\/ Gather and merge all calendar events<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF; font-style: italic\">let<\/span><span style=\"color: #F8F8F2\"> allEvents <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> [];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">calendarIds.<\/span><span style=\"color: #A6E22E\">forEach<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FD971F; font-style: italic\">calendarId<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">=&gt;<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> calendar <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> CalendarApp.<\/span><span style=\"color: #A6E22E\">getCalendarById<\/span><span style=\"color: #F8F8F2\">(calendarId);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (<\/span><span style=\"color: #F92672\">!<\/span><span style=\"color: #F8F8F2\">calendar) <\/span><span style=\"color: #F92672\">return<\/span><span style=\"color: #F8F8F2\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> events <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> calendar.<\/span><span style=\"color: #A6E22E\">getEvents<\/span><span style=\"color: #F8F8F2\">(dayStart, dayEnd);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  events.<\/span><span style=\"color: #A6E22E\">forEach<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FD971F; font-style: italic\">event<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">=&gt;<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    allEvents.<\/span><span style=\"color: #A6E22E\">push<\/span><span style=\"color: #F8F8F2\">({ start: event.<\/span><span style=\"color: #A6E22E\">getStartTime<\/span><span style=\"color: #F8F8F2\">(), end: event.<\/span><span style=\"color: #A6E22E\">getEndTime<\/span><span style=\"color: #F8F8F2\">() });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">});<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">allEvents.<\/span><span style=\"color: #A6E22E\">sort<\/span><span style=\"color: #F8F8F2\">((<\/span><span style=\"color: #FD971F; font-style: italic\">a<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #FD971F; font-style: italic\">b<\/span><span style=\"color: #F8F8F2\">) <\/span><span style=\"color: #66D9EF; font-style: italic\">=&gt;<\/span><span style=\"color: #F8F8F2\"> a.start <\/span><span style=\"color: #F92672\">-<\/span><span style=\"color: #F8F8F2\"> b.start);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">\/\/ Merge overlapping events to get busy periods<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF; font-style: italic\">let<\/span><span style=\"color: #F8F8F2\"> mergedEvents <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> [];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">allEvents.<\/span><span style=\"color: #A6E22E\">forEach<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FD971F; font-style: italic\">event<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">=&gt;<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (<\/span><span style=\"color: #F92672\">!<\/span><span style=\"color: #F8F8F2\">mergedEvents.length) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    mergedEvents.<\/span><span style=\"color: #A6E22E\">push<\/span><span style=\"color: #F8F8F2\">({ start: event.start, end: event.end });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  } <\/span><span style=\"color: #F92672\">else<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #66D9EF; font-style: italic\">let<\/span><span style=\"color: #F8F8F2\"> last <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> mergedEvents&#91;mergedEvents.length <\/span><span style=\"color: #F92672\">-<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\">&#93;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (event.start <\/span><span style=\"color: #F92672\">&lt;=<\/span><span style=\"color: #F8F8F2\"> last.end) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      last.end <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(Math.<\/span><span style=\"color: #A6E22E\">max<\/span><span style=\"color: #F8F8F2\">(last.end.<\/span><span style=\"color: #A6E22E\">getTime<\/span><span style=\"color: #F8F8F2\">(), event.end.<\/span><span style=\"color: #A6E22E\">getTime<\/span><span style=\"color: #F8F8F2\">()));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    } <\/span><span style=\"color: #F92672\">else<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">      mergedEvents.<\/span><span style=\"color: #A6E22E\">push<\/span><span style=\"color: #F8F8F2\">({ start: event.start, end: event.end });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">});<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">\/\/ Calculate free time slots between busy periods<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF; font-style: italic\">let<\/span><span style=\"color: #F8F8F2\"> freeTimes <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> [];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF; font-style: italic\">let<\/span><span style=\"color: #F8F8F2\"> prevEnd <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(dayStart);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">mergedEvents.<\/span><span style=\"color: #A6E22E\">forEach<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #FD971F; font-style: italic\">event<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #66D9EF; font-style: italic\">=&gt;<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (event.start <\/span><span style=\"color: #F92672\">&gt;<\/span><span style=\"color: #F8F8F2\"> prevEnd) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    freeTimes.<\/span><span style=\"color: #A6E22E\">push<\/span><span style=\"color: #F8F8F2\">({ start: <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(prevEnd), end: <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(event.start) });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  prevEnd <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(Math.<\/span><span style=\"color: #A6E22E\">max<\/span><span style=\"color: #F8F8F2\">(prevEnd.<\/span><span style=\"color: #A6E22E\">getTime<\/span><span style=\"color: #F8F8F2\">(), event.end.<\/span><span style=\"color: #A6E22E\">getTime<\/span><span style=\"color: #F8F8F2\">()));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">});<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (prevEnd <\/span><span style=\"color: #F92672\">&lt;<\/span><span style=\"color: #F8F8F2\"> dayEnd) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  freeTimes.<\/span><span style=\"color: #A6E22E\">push<\/span><span style=\"color: #F8F8F2\">({ start: <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(prevEnd), end: <\/span><span style=\"color: #F92672\">new<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #A6E22E\">Date<\/span><span style=\"color: #F8F8F2\">(dayEnd) });<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">For each date, the script retrieves all calendar events for the specified time range across all selected calendars.<br>It then merges any overlapping events into busy periods.<br>By identifying the gaps between these busy periods, the script calculates the common free time slots\u2014intervals when <strong>everyone is available<\/strong>.<br>These free time slots are stored as start and end times for later output.<\/p>\n<\/dd>\n\n\n\n<dt class=\"swell-block-dl__dt\">Outputting Common Free Time to the Spreadsheet<\/dt>\n\n\n\n<dd class=\"swell-block-dl__dd\">\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>sheet.getRange(\"A9:B\").clear();\n\nif (freeTimeSlots.length === 0) {\n  sheet.getRange(\"A9:B9\").setValues([&#91;\"No available time slots found.\", \"\"&#93;]);\n} else {\n  const outputRange = sheet.getRange(9, 1, freeTimeSlots.length, 2);\n  outputRange.setValues(freeTimeSlots);\n}\n\n\/\/ Header styling\nconst headerRange = sheet.getRange(\"A8:B8\");\nheaderRange.setValues([&#91;\"Date\", \"Free Time\"&#93;]);\nheaderRange.setHorizontalAlignment(\"center\");\nheaderRange.setBackground(\"#e6f4ea\");\nconst timeColumnRange = sheet.getRange(9, 2, freeTimeSlots.length, 1);\ntimeColumnRange.setHorizontalAlignment(\"right\");\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki monokai\" style=\"background-color: #272822\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F8F8F2\">sheet.<\/span><span style=\"color: #A6E22E\">getRange<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;A9:B&quot;<\/span><span style=\"color: #F8F8F2\">).<\/span><span style=\"color: #A6E22E\">clear<\/span><span style=\"color: #F8F8F2\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F92672\">if<\/span><span style=\"color: #F8F8F2\"> (freeTimeSlots.length <\/span><span style=\"color: #F92672\">===<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #AE81FF\">0<\/span><span style=\"color: #F8F8F2\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  sheet.<\/span><span style=\"color: #A6E22E\">getRange<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;A9:B9&quot;<\/span><span style=\"color: #F8F8F2\">).<\/span><span style=\"color: #A6E22E\">setValues<\/span><span style=\"color: #F8F8F2\">([&#91;<\/span><span style=\"color: #E6DB74\">&quot;No available time slots found.&quot;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E6DB74\">&quot;&quot;<\/span><span style=\"color: #F8F8F2\">&#93;]);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">} <\/span><span style=\"color: #F92672\">else<\/span><span style=\"color: #F8F8F2\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  <\/span><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> outputRange <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> sheet.<\/span><span style=\"color: #A6E22E\">getRange<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #AE81FF\">9<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\">, freeTimeSlots.length, <\/span><span style=\"color: #AE81FF\">2<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">  outputRange.<\/span><span style=\"color: #A6E22E\">setValues<\/span><span style=\"color: #F8F8F2\">(freeTimeSlots);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #88846F\">\/\/ Header styling<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> headerRange <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> sheet.<\/span><span style=\"color: #A6E22E\">getRange<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;A8:B8&quot;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">headerRange.<\/span><span style=\"color: #A6E22E\">setValues<\/span><span style=\"color: #F8F8F2\">([&#91;<\/span><span style=\"color: #E6DB74\">&quot;Date&quot;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E6DB74\">&quot;Free Time&quot;<\/span><span style=\"color: #F8F8F2\">&#93;]);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">headerRange.<\/span><span style=\"color: #A6E22E\">setHorizontalAlignment<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;center&quot;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">headerRange.<\/span><span style=\"color: #A6E22E\">setBackground<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;#e6f4ea&quot;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #66D9EF; font-style: italic\">const<\/span><span style=\"color: #F8F8F2\"> timeColumnRange <\/span><span style=\"color: #F92672\">=<\/span><span style=\"color: #F8F8F2\"> sheet.<\/span><span style=\"color: #A6E22E\">getRange<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #AE81FF\">9<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #AE81FF\">2<\/span><span style=\"color: #F8F8F2\">, freeTimeSlots.length, <\/span><span style=\"color: #AE81FF\">1<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">timeColumnRange.<\/span><span style=\"color: #A6E22E\">setHorizontalAlignment<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E6DB74\">&quot;right&quot;<\/span><span style=\"color: #F8F8F2\">);<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n<\/dd>\n\n\n\n<dd class=\"swell-block-dl__dd\">\n<p class=\"wp-block-paragraph\">The script clears any previous results and writes the new list of common free time slots starting from cell A9.<br>If no common free time is found, a message is displayed.<br>The header row is styled for readability.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n<\/dd>\n<\/dl>\n<\/div><\/details>\n<\/div>\n<\/div><\/div>\n\n\n\n<div class=\"swell-block-step__item\"><div class=\"swell-block-step__number u-bg-main\"><span class=\"__label\">STEP<\/span><\/div><div class=\"swell-block-step__title u-fz-l\">Saving Your Script<\/div><div class=\"swell-block-step__body\"><div class=\"wp-block-image is-style-shadow u-mb-ctrl u-mb-40\">\n<figure class=\"alignleft size-large is-resized\"><img decoding=\"async\" width=\"1024\" height=\"468\" src=\"https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-281-1024x468.png\" alt=\"\" class=\"wp-image-22558\" style=\"width:655px;height:auto\" srcset=\"https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-281-1024x468.png 1024w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-281-300x137.png 300w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-281-768x351.png 768w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-281.png 1378w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">After writing your script, give it a descriptive name and save it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">(For example: SharedAvailability\uff09<\/p>\n<\/div><\/div>\n\n\n\n<div class=\"swell-block-step__item\"><div class=\"swell-block-step__number u-bg-main\"><span class=\"__label\">STEP<\/span><\/div><div class=\"swell-block-step__title u-fz-l\">Running the Script<\/div><div class=\"swell-block-step__body\"><div class=\"wp-block-image u-mb-ctrl u-mb-40 is-style-shadow\">\n<figure class=\"alignleft size-large is-resized\"><img decoding=\"async\" width=\"1024\" height=\"468\" src=\"https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-283-1024x468.png\" alt=\"\" class=\"wp-image-22560\" style=\"width:661px;height:auto\" srcset=\"https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-283-1024x468.png 1024w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-283-300x137.png 300w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-283-768x351.png 768w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-283.png 1378w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"u-mb-ctrl u-mb-40 wp-block-paragraph\">When you run the script, it will search each Google Calendar for overlapping availability and list all common free time slots.<\/p>\n\n\n\n<div class=\"wp-block-group is-style-big_icon_memo u-mb-ctrl u-mb-60\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"wp-block-paragraph\">If you&#8217;re running the script for the first time, you need to authorize it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Therefore, press &#8220;<strong>Review Permissions.<\/strong>&#8220;<\/strong><\/p>\n\n\n<div class=\"wp-block-image u-mb-ctrl u-mb-50\">\n<figure class=\"alignleft size-full\"><img decoding=\"async\" width=\"882\" height=\"345\" src=\"https:\/\/84office.jp\/wp-content\/uploads\/2024\/11\/image-79.png\" alt=\"\" class=\"wp-image-15938\" srcset=\"https:\/\/84office.jp\/wp-content\/uploads\/2024\/11\/image-79.png 882w, https:\/\/84office.jp\/wp-content\/uploads\/2024\/11\/image-79-300x117.png 300w, https:\/\/84office.jp\/wp-content\/uploads\/2024\/11\/image-79-768x300.png 768w\" sizes=\"(max-width: 882px) 100vw, 882px\" \/><\/figure>\n<\/div>\n\n\n<div class=\"swell-block-accordion\">\n<details class=\"swell-block-accordion__item\" data-swl-acc=\"wrapper\"><summary class=\"swell-block-accordion__title\" data-swl-acc=\"header\"><span class=\"swell-block-accordion__label\">Detailed Authorization Steps<\/span><span class=\"swell-block-accordion__icon c-switchIconBtn\" data-swl-acc=\"icon\" aria-hidden=\"true\" data-opened=\"false\"><i class=\"__icon--closed icon-caret-down\"><\/i><i class=\"__icon--opened icon-caret-up\"><\/i><\/span><\/summary><div class=\"swell-block-accordion__body\" data-swl-acc=\"body\">\n<p class=\"wp-block-paragraph\"><strong>Press &#8220;Advanced.&#8221;<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full u-mb-ctrl u-mb-50\"><img decoding=\"async\" width=\"1272\" height=\"688\" src=\"https:\/\/84office.jp\/wp-content\/uploads\/2024\/11\/188993dfac23ed4b35c326d75de2796d.jpg\" alt=\"\" class=\"wp-image-15939\" srcset=\"https:\/\/84office.jp\/wp-content\/uploads\/2024\/11\/188993dfac23ed4b35c326d75de2796d.jpg 1272w, https:\/\/84office.jp\/wp-content\/uploads\/2024\/11\/188993dfac23ed4b35c326d75de2796d-300x162.jpg 300w, https:\/\/84office.jp\/wp-content\/uploads\/2024\/11\/188993dfac23ed4b35c326d75de2796d-1024x554.jpg 1024w, https:\/\/84office.jp\/wp-content\/uploads\/2024\/11\/188993dfac23ed4b35c326d75de2796d-768x415.jpg 768w\" sizes=\"(max-width: 1272px) 100vw, 1272px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Press &#8220;Go to Untitled project (Unsafe).&#8221;<\/strong><\/p>\n\n\n<div class=\"wp-block-image u-mb-ctrl u-mb-50\">\n<figure class=\"alignleft size-full\"><img decoding=\"async\" width=\"1305\" height=\"893\" src=\"https:\/\/84office.jp\/wp-content\/uploads\/2024\/11\/b7775751f92380510b389302eaafe1b9.jpg\" alt=\"\" class=\"wp-image-15940\" srcset=\"https:\/\/84office.jp\/wp-content\/uploads\/2024\/11\/b7775751f92380510b389302eaafe1b9.jpg 1305w, https:\/\/84office.jp\/wp-content\/uploads\/2024\/11\/b7775751f92380510b389302eaafe1b9-300x205.jpg 300w, https:\/\/84office.jp\/wp-content\/uploads\/2024\/11\/b7775751f92380510b389302eaafe1b9-1024x701.jpg 1024w, https:\/\/84office.jp\/wp-content\/uploads\/2024\/11\/b7775751f92380510b389302eaafe1b9-768x526.jpg 768w\" sizes=\"(max-width: 1305px) 100vw, 1305px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\"><strong>After that, press &#8220;Allow.&#8221;<\/strong><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignleft size-full is-resized\"><img decoding=\"async\" width=\"955\" height=\"543\" src=\"https:\/\/84office.jp\/wp-content\/uploads\/2024\/11\/7ebb34b4d2c42fa532ad1c35c1ec1049.jpg\" alt=\"\" class=\"wp-image-15941\" style=\"width:566px;height:auto\" srcset=\"https:\/\/84office.jp\/wp-content\/uploads\/2024\/11\/7ebb34b4d2c42fa532ad1c35c1ec1049.jpg 955w, https:\/\/84office.jp\/wp-content\/uploads\/2024\/11\/7ebb34b4d2c42fa532ad1c35c1ec1049-300x171.jpg 300w, https:\/\/84office.jp\/wp-content\/uploads\/2024\/11\/7ebb34b4d2c42fa532ad1c35c1ec1049-768x437.jpg 768w\" sizes=\"(max-width: 955px) 100vw, 955px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n<\/div><\/details>\n<\/div>\n<\/div><\/div>\n<\/div><\/div>\n\n\n\n<div class=\"swell-block-step__item\"><div class=\"swell-block-step__number u-bg-main\"><span class=\"__label\">STEP<\/span><\/div><div class=\"swell-block-step__title u-fz-l\">Checking the Results in Google Sheets<\/div><div class=\"swell-block-step__body\"><div class=\"wp-block-image u-mb-ctrl u-mb-40 is-style-shadow\">\n<figure class=\"alignleft size-full is-resized\"><img decoding=\"async\" width=\"1069\" height=\"742\" src=\"https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-284.png\" alt=\"\" class=\"wp-image-22562\" style=\"width:520px;height:auto\" srcset=\"https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-284.png 1069w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-284-300x208.png 300w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-284-1024x711.png 1024w, https:\/\/84office.jp\/wp-content\/uploads\/2025\/07\/image-284-768x533.png 768w\" sizes=\"(max-width: 1069px) 100vw, 1069px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Once the script runs successfully, the shared free time slots for each date will be displayed in the &#8220;Check Availability&#8221; sheet starting from row 9.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If everyone\u2019s schedules overlap and no common free time exists, a message saying \u201cNo available time slots found.\u201d will appear.<\/p>\n<\/div><\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading u-mb-ctrl u-mb-40\">Notes<\/h2>\n\n\n\n<dl class=\"swell-block-dl is-style-border u-mb-ctrl u-mb-60\">\n<dt class=\"swell-block-dl__dt\"><strong>Handling All-Day Events<\/strong><\/dt>\n\n\n\n<dd class=\"swell-block-dl__dd\">\n<p class=\"wp-block-paragraph\">Be aware that all-day events (such as \u201cHome\u201d or \u201cOut of Office\u201d marked as all-day in the calendar) can interfere with the free time extraction process. If these events overlap with other schedules, the script may not be able to identify any available time slots.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To prevent this, consider changing all-day events to time-specific events, or limit the calendars included in the extraction to only those relevant for finding shared availability.<\/p>\n<\/dd>\n\n\n\n<dt class=\"swell-block-dl__dt\">Setting the Time Range<\/dt>\n\n\n\n<dd class=\"swell-block-dl__dd\">\n<p class=\"wp-block-paragraph\">When specifying the time range for free time extraction (e.g., 10:00\u201318:00), please enter the start time (cell B4) and end time (cell B5) as plain text (e.g., \u201c10:00\u201d).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you enter times using Google Sheets\u2019 time format, the script may interpret the values incorrectly and fail to extract the correct time slots.<\/p>\n<\/dd>\n\n\n\n<dd class=\"swell-block-dl__dd\">\n<p class=\"wp-block-paragraph\">If cells B4 (start time) and B5 (end time) are left blank, the script will search for free time across the entire 24-hour period.<\/p>\n<\/dd>\n\n\n\n<dt class=\"swell-block-dl__dt\">Checking Your Calendar IDs<\/dt>\n\n\n\n<dd class=\"swell-block-dl__dd\">\n<p class=\"wp-block-paragraph\">If your Calendar IDs are not entered correctly, the script may fail to retrieve the right data.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When working with multiple calendars, make sure to enter each Calendar ID horizontally from cell B1 to the right.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Double-check that all required IDs are included and correctly typed.<\/p>\n<\/dd>\n<\/dl>\n\n\n\n<h2 class=\"wp-block-heading u-mb-ctrl u-mb-40\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">By using Google Apps Script to extract and organize common free time from Google Calendar into a spreadsheet, you can efficiently check and manage the availability of multiple team members.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This approach streamlines the process of scheduling meetings or appointments and helps eliminate wasted time spent coordinating everyone\u2019s calendars.<\/p>\n\n\n\n<p class=\"u-mb-ctrl u-mb-40 wp-block-paragraph\">Just remember: if there are any all-day events, the script may not be able to find common free time slots\u2014so keep this in mind when reviewing the results.<\/p>\n\n\n<div class=\"swell-block-postLink u-mb-ctrl u-mb-60\">\t\t\t<div class=\"p-blogCard -internal\" data-type=\"type1\" data-onclick=\"clickLink\">\n\t\t\t\t<div class=\"p-blogCard__inner\">\n\t\t\t\t\t<span class=\"p-blogCard__caption\">\u3042\u308f\u305b\u3066\u8aad\u307f\u305f\u3044<\/span>\n\t\t\t\t\t<div class=\"p-blogCard__thumb c-postThumb\"><figure class=\"c-postThumb__figure\"><img decoding=\"async\" src=\"https:\/\/84office.jp\/wp-content\/uploads\/2025\/04\/f91d5ddf6ccd121e6e90e94c49104269-300x158.jpg\" alt=\"\" class=\"c-postThumb__img u-obf-cover\" width=\"320\" height=\"180\"><\/figure><\/div>\t\t\t\t\t<div class=\"p-blogCard__body\">\n\t\t\t\t\t\t<a class=\"p-blogCard__title\" href=\"https:\/\/84office.jp\/google-calendar-free-time-template\/\" target=\"_blank\" rel=\"noopener noreferrer\">Google\u30ab\u30ec\u30f3\u30c0\u30fc\u7a7a\u304d\u6642\u9593\u62bd\u51fa\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\uff5c\u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8 \u00d7 GAS<\/a>\n\t\t\t\t\t\t<span class=\"p-blogCard__excerpt\">\u4ee5\u524d\u306e\u8a18\u4e8b\u300eGoogle\u30ab\u30ec\u30f3\u30c0\u30fc\u306e\u7a7a\u304d\u6642\u9593\u3092\u62bd\u51fa\u3059\u308b\u65b9\u6cd5\uff5cGAS\u3067\u8907\u6570\u4eba\u306e\u5171\u901a\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u3092\u7ba1\u7406\u300f\u3067\u306f\u3001Google Apps Script\uff08GAS\uff09\u3092\u4f7f\u3063\u3066\u3001\u8907\u6570\u30e1\u30f3\u30d0\u30fc\u306e\u30ab\u30ec\u30f3\u30c0\u30fc&#8230;<\/span>\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t<\/div>\n\n<div class=\"swell-block-postLink\">\t\t\t<a href=\"https:\/\/84office.jp\/calendar-schedule-get\/\" class=\"c-blogLink -internal\" data-style=\"slim\">\n\t\t\t\t<!-- <i class=\"c-blogLink__icon icon-link\" role=\"presentation\"><\/i> -->\n\t\t\t\t<span class=\"c-blogLink__icon\">\n\t\t\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"swl-svg-link __svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 48 48\" role=\"img\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M21.2 30.2c-.5 0-1-.2-1.4-.6l-.7-.7c-2.3-2.3-3.5-5.3-3.5-8.5s1.2-6.2 3.5-8.5l7.1-7.1c2.3-2.3 5.3-3.5 8.5-3.5s6.2 1.2 8.5 3.5c4.7 4.7 4.7 12.3 0 17l-3.5 3.5c-.8.8-2 .8-2.8 0-.8-.8-.8-2 0-2.8l3.5-3.5c3.1-3.1 3.1-8.2 0-11.3-1.5-1.5-3.5-2.3-5.7-2.3-2.1 0-4.2.8-5.7 2.3l-7.1 7.1c-1.5 1.5-2.3 3.5-2.3 5.7s.8 4.2 2.3 5.7l.7.7c.8.8.8 2 0 2.8-.4.3-.9.5-1.4.5z\" \/><path d=\"M13.4 46.6c-3.1 0-6.1-1.2-8.5-3.5-2.3-2.3-3.5-5.3-3.5-8.5s1.2-6.2 3.5-8.5l3.5-3.5c.8-.8 2-.8 2.8 0 .8.8.8 2 0 2.8l-3.5 3.5c-1.5 1.5-2.3 3.5-2.3 5.7 0 2.1.8 4.2 2.3 5.7 3.1 3.1 8.2 3.1 11.3 0l7.1-7.1c1.5-1.5 2.3-3.5 2.3-5.7 0-2.1-.8-4.2-2.3-5.7l-.7-.7c-.8-.8-.8-2 0-2.8.8-.8 2-.8 2.8 0l.7.7c2.3 2.3 3.5 5.3 3.5 8.5s-1.2 6.2-3.5 8.5l-7.1 7.1c-2.3 2.3-5.3 3.5-8.4 3.5z\" \/><\/svg>\t\t\t\t<\/span>\n\t\t\t\t<span class=\"c-blogLink__text\">Google\u30ab\u30ec\u30f3\u30c0\u30fc\u306e\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u3092\u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u306b\u66f8\u304d\u51fa\u3057\uff5cGAS\u3067\u8907\u6570\u4eba\u306e\u4e88\u5b9a\u3082\u4e00\u62ec\u53d6\u5f97\uff01<\/span>\n\t\t\t<\/a>\n\t\t<\/div>\n\n<div class=\"swell-block-postLink u-mb-ctrl u-mb-40\">\t\t\t<a href=\"https:\/\/84office.jp\/googlesheets-calendar-linkage\/\" class=\"c-blogLink -internal\" data-style=\"slim\">\n\t\t\t\t<!-- <i class=\"c-blogLink__icon icon-link\" role=\"presentation\"><\/i> -->\n\t\t\t\t<span class=\"c-blogLink__icon\">\n\t\t\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"swl-svg-link __svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 48 48\" role=\"img\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M21.2 30.2c-.5 0-1-.2-1.4-.6l-.7-.7c-2.3-2.3-3.5-5.3-3.5-8.5s1.2-6.2 3.5-8.5l7.1-7.1c2.3-2.3 5.3-3.5 8.5-3.5s6.2 1.2 8.5 3.5c4.7 4.7 4.7 12.3 0 17l-3.5 3.5c-.8.8-2 .8-2.8 0-.8-.8-.8-2 0-2.8l3.5-3.5c3.1-3.1 3.1-8.2 0-11.3-1.5-1.5-3.5-2.3-5.7-2.3-2.1 0-4.2.8-5.7 2.3l-7.1 7.1c-1.5 1.5-2.3 3.5-2.3 5.7s.8 4.2 2.3 5.7l.7.7c.8.8.8 2 0 2.8-.4.3-.9.5-1.4.5z\" \/><path d=\"M13.4 46.6c-3.1 0-6.1-1.2-8.5-3.5-2.3-2.3-3.5-5.3-3.5-8.5s1.2-6.2 3.5-8.5l3.5-3.5c.8-.8 2-.8 2.8 0 .8.8.8 2 0 2.8l-3.5 3.5c-1.5 1.5-2.3 3.5-2.3 5.7 0 2.1.8 4.2 2.3 5.7 3.1 3.1 8.2 3.1 11.3 0l7.1-7.1c1.5-1.5 2.3-3.5 2.3-5.7 0-2.1-.8-4.2-2.3-5.7l-.7-.7c-.8-.8-.8-2 0-2.8.8-.8 2-.8 2.8 0l.7.7c2.3 2.3 3.5 5.3 3.5 8.5s-1.2 6.2-3.5 8.5l-7.1 7.1c-2.3 2.3-5.3 3.5-8.4 3.5z\" \/><\/svg>\t\t\t\t<\/span>\n\t\t\t\t<span class=\"c-blogLink__text\">\u30b9\u30d7\u30ec\u30c3\u30c9\u30b7\u30fc\u30c8\u306e\u4e88\u5b9a\u3092Google\u30ab\u30ec\u30f3\u30c0\u30fc\u306b\u307e\u3068\u3081\u3066\u767b\u9332\u3059\u308b\u65b9\u6cd5\uff5cGAS\u3067\u52b9\u7387\u5316\uff01<\/span>\n\t\t\t<\/a>\n\t\t<\/div>\n\n\n<p class=\"is-style-emboss_box has-swl-pale-02-background-color has-background wp-block-paragraph\">Our company offers support for improving work efficiency through the use of Google Apps Script. <br>If you need assistance with Google Apps Script customization or error resolution, please feel free to contact us. <br>We are fully committed to supporting your business improvements.<br><br><a href=\"https:\/\/84office.jp\/contact\/\">Contact us here<br><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Have you ever found it time-consuming to search for common free time when coordinating schedules within your t [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":22567,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"swell_btn_cv_data":"","_locale":"en_US","_original_post":"https:\/\/84office.jp\/?p=15562","footnotes":""},"categories":[12],"tags":[],"class_list":["post-22555","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-12","en-US"],"_links":{"self":[{"href":"https:\/\/84office.jp\/wp-json\/wp\/v2\/posts\/22555","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/84office.jp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/84office.jp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/84office.jp\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/84office.jp\/wp-json\/wp\/v2\/comments?post=22555"}],"version-history":[{"count":2,"href":"https:\/\/84office.jp\/wp-json\/wp\/v2\/posts\/22555\/revisions"}],"predecessor-version":[{"id":22566,"href":"https:\/\/84office.jp\/wp-json\/wp\/v2\/posts\/22555\/revisions\/22566"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/84office.jp\/wp-json\/wp\/v2\/media\/22567"}],"wp:attachment":[{"href":"https:\/\/84office.jp\/wp-json\/wp\/v2\/media?parent=22555"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/84office.jp\/wp-json\/wp\/v2\/categories?post=22555"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/84office.jp\/wp-json\/wp\/v2\/tags?post=22555"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}