この記事の読了時間は約8分です。
Googleカレンダーにシフトのスケジュールを取り込むのは面倒。普通にやると、1日ごとに時間帯を設定しないといけないので、20回勤務日があれば20回設定しないといけない。
早出、遅出、日勤、夜勤などの変則シフトであればなおさら。
そんな煩わしいシフトスケジュール入力を、簡単にする方法を発見したので、実際に試してみました。コピペ中心なので、パソコン初心者でもできます!
やってみてわかりにくかった所は、わかるように噛み砕いて、注意点など説明するよ。
目次(クリックでワープ)
Googleカレンダー+Googleドライブ
僕は今、特別養護老人ホームで働いています。
勤務はシフト制で月9日休みが基本。
時間は早出、遅出、日勤、夜勤があって、人が足りないと日遅、早日などもあります。
Googleカレンダー+Googleドライブの使い分け
Googleカレンダー
アプリだけでなくWebからも管理でき、同期も自動で行ってくれる。
Googleドライブ
クラウドサービス。フォルダ共有など簡単にできる。
Googleカレンダー+Googleドライブの不便さ
歯医者などを予約する時に
- 勤務表をGoogleドライブで確認して、休みを把握
- Googleカレンダーで休みの日に用事が入ってないかチェック
しなくちゃ駄目だなので、手間だし、ミスも起こりやすい事態になっていました。
変則シフトをGoogleカレンダーに簡単に取りこむ方法
Googleカレンダーにシフトを簡単登録する方法(記事3つ)
以下の3つの記事が該当記事になります。
元記事作成者のtwitter https://twitter.com/mada_chugakusei
以下、この3つの記事内容を実践した時に学んだ注意点と、初心者でもできるように、わかりやすく作業工程をまとめてみました。
Googleカレンダーにシフト(8パターン勤務)を簡単登録
上記の元記事サイトでは、2つの勤務パターンを例にコードが書かれており、それ以上の勤務パターンを作る場合は自分でコードを追加するという手間が必要です。
本記事では、上記のサイトで紹介されている方法、コードを使って早出A、早出B、遅出A、遅出B、日勤、日遅、早日、夜勤の8つのシフトを時間帯付きでGoogleカレンダーで自動入力されるようにしました。
8つの勤務パターンでコードを書いた(追加)したので、1~8以内の勤務パターンであればコピペ、削除で対応できます。
以下、実践してみて気付いた注意点を紹介します。
導入までの流れ
目標
Googleドライブで勤務日をアンケート記入する→Googleカレンダーに自動反映させる。
やる事
- Googleドライブでアンケートを作成
- アンケート送信したら自動でGoogleカレンダーに反映させるトリガー(引き金)を作る
流れ詳細
詳しくわかる必要はありません。この流れで作業をしていくので、「あれ今なにやってんだろう?」と迷子にならないようにフローチャートを作成しました↓
- Googleドライブ>Googleフォームでアンケートを作成
- そのアンケートに早出、遅出などの勤務日を回答する
- その入力データをスプレッドシートで表示させる。
- 実行させるプログラムを書く(95%コピペでOK)
- トリガーを設定して「2アンケートを送信」したら自動でGoogleカレンダーに反映させるようにする。
- エラーが出なければプログラム通り実行され、Googleカレンダーに反映されている。
- もしプログラムを修正したり追加した場合は、実行>executeInPostingを選んでプログラムを走らせる。
これができれば、後は毎月発表される勤務表を元に「2.アンケートに早出、遅出などの勤務日を選択する」だけで、自動でGoogleカレンダーにシフトが登録されるようになります。
<1>Googleドライブ>Googleフォームでアンケートを作成
Googleドライブへアクセス
Googleドライブから「Googleドライブにアクセス」をクリック。
Googleフォームの作成
ドライブ上>マイドライブ>その他>Googleフォーム
西暦、月の質問項目を作る
「無題のフォーム」を「勤務予定」などと入力し、
「無題の質問」を「西暦」と変え、プルダウンで1.2016 2.2017 3.2018と入力。
※年数はあとから追加できます。
質問を追加をクリックして、「月」でプルダウン、1.1 2.2 ~ 12.12と入力
勤務パターン名、1~31までの質問を作る
セクションを追加し、「無題のセクション」はそのまま、「早番A」などと自分の勤務パターン名を入力する。選択方式をチェックボックスにして1~31まで選択肢を作る。
セクションのコピー、質問と選択肢のコピーが可能なので、あとはコピペで勤務名のみ変更して「勤務名と1~31」と質問を必要分作る。
<2>アンケートに早出、遅出などの勤務日を回答する
図の番号順にクリックし、URLに移動すると、作成したアンケートを回答するページに移動する。そこで、作ったアンケートに、自分のシフトを回答し、「送信」する。
例)早番が1日と13日なら、早番の質問項目に1と13をチェックする。
<3>アンケート入力データをスプレッドシートで表示
ここからは、アンケート結果をカレンダーに自動反映させるプログラムを作る下準備。
編集画面へ戻り
回答をクリック
スプレッドシートの作成をクリック
新しいスプレッドシートを作成する
すると自動でスプレッドシート画面に切り替わる。
このスプレッドシートはGoogleドライブ上に保存されるので、いつでもアクセスが可能だ。
<4>実行させるプログラムを書く(95%コピペでOK)
スクリプトエディタを開く
スプレッドシートから>ツール>スクリプトエディタを選択。
プロジェクト名を変更する
スクリプトエディタはGoogleドライブ上には表示されない。スプレッドシートを表示させてスクリプトエディタの編集を選択するとプログラムを書いたコードが表示され、追加・変更ができる。
コード.gsに以下のコードをコピペする(2016.3.8修正)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
function myFunction() { Logger.log('シフト勤務登録を作るぞ!'); } function executeInPosting() { //========================================================== // 設定箇所 //========================================================== var CALENDAR_ID = '〜@gmail.com'; var SHIFT1 = '早番A'; var SHIFT1_START_TIME = '7:00'; var SHIFT1_END_TIME = '16:00' var SHIFT2 = '早番B'; var SHIFT2_START_TIME = '7:00'; var SHIFT2_END_TIME = '16:00' var SHIFT3 = '遅番A'; var SHIFT3_START_TIME = '11:30'; var SHIFT3_END_TIME = '20:30' var SHIFT4 = '遅番B'; var SHIFT4_START_TIME = '11:30'; var SHIFT4_END_TIME = '20:30' var SHIFT5 = '日勤'; var SHIFT5_START_TIME = '9:00'; var SHIFT5_END_TIME = '18:00' var SHIFT6 = '日遅'; var SHIFT6_START_TIME = '9:00'; var SHIFT6_END_TIME = '20:30' var SHIFT7 = '早日'; var SHIFT7_START_TIME = '7:00'; var SHIFT7_END_TIME = '16:00' var SHIFT8 = '夜勤'; var SHIFT8_START_TIME = '16:00'; var SHIFT8_END_TIME = '33:30' var YEAR_COLUMN = 'B'; var MONTH_COLUMN = 'C'; var SHIFT1_COLUMN = 'D'; var SHIFT2_COLUMN = 'E'; var SHIFT3_COLUMN = 'F'; var SHIFT4_COLUMN = 'G'; var SHIFT5_COLUMN = 'H'; var SHIFT6_COLUMN = 'I'; var SHIFT7_COLUMN = 'J'; var SHIFT8_COLUMN = 'K'; //---------------------------------------------------------- var sheet = SpreadsheetApp.getActiveSheet(); bottom = sheet.getLastRow(); var year = sheet.getRange(YEAR_COLUMN + bottom).getValue(); var month = sheet.getRange(MONTH_COLUMN + bottom).getValue(); var shift1 = sheet.getRange(SHIFT1_COLUMN + bottom).getValue(); var shift2 = sheet.getRange(SHIFT2_COLUMN + bottom).getValue(); var shift3 = sheet.getRange(SHIFT3_COLUMN + bottom).getValue(); var shift4 = sheet.getRange(SHIFT4_COLUMN + bottom).getValue(); var shift5 = sheet.getRange(SHIFT5_COLUMN + bottom).getValue(); var shift6 = sheet.getRange(SHIFT6_COLUMN + bottom).getValue(); var shift7 = sheet.getRange(SHIFT7_COLUMN + bottom).getValue(); var shift8 = sheet.getRange(SHIFT8_COLUMN + bottom).getValue(); var shift1List = String(shift1).split(','); var shift2List = String(shift2).split(','); var shift3List = String(shift3).split(','); var shift4List = String(shift4).split(','); var shift5List = String(shift5).split(','); var shift6List = String(shift6).split(','); var shift7List = String(shift7).split(','); var shift8List = String(shift8).split(','); // シフト1を登録 for (var i = 0; i < shift1List.length; i++) { var dateStr = year + '/' + month + '/' + shift1List[i]; Logger.log(dateStr); var date = new Date(dateStr); Logger.log(date); createEvent(CALENDAR_ID, SHIFT1, date, SHIFT1_START_TIME, SHIFT1_END_TIME); Logger.log('createEvent() is done.'); } // シフト2を登録 for (var i = 0; i < shift2List.length; i++) { var dateStr = year + '/' + month + '/' + shift2List[i]; Logger.log(dateStr); var date = new Date(dateStr); Logger.log(date); createEvent(CALENDAR_ID, SHIFT2, date, SHIFT2_START_TIME, SHIFT2_END_TIME); Logger.log('createEvent() is done.'); } // シフト3を登録 for (var i = 0; i < shift3List.length; i++) { var dateStr = year + '/' + month + '/' + shift3List[i]; Logger.log(dateStr); var date = new Date(dateStr); Logger.log(date); createEvent(CALENDAR_ID,SHIFT3, date, SHIFT3_START_TIME, SHIFT3_END_TIME); Logger.log('createEvent() is done.'); } // シフト4を登録 for (var i = 0; i < shift4List.length; i++) { var dateStr = year + '/' + month + '/' + shift4List[i]; Logger.log(dateStr); var date = new Date(dateStr); Logger.log(date); createEvent(CALENDAR_ID, SHIFT4, date, SHIFT4_START_TIME, SHIFT4_END_TIME); Logger.log('createEvent() is done.'); } // シフト5を登録 for (var i = 0; i < shift5List.length; i++) { var dateStr = year + '/' + month + '/' + shift5List[i]; Logger.log(dateStr); var date = new Date(dateStr); Logger.log(date); createEvent(CALENDAR_ID, SHIFT5, date, SHIFT5_START_TIME, SHIFT5_END_TIME); Logger.log('createEvent() is done.'); } // シフト6を登録 for (var i = 0; i < shift6List.length; i++) { var dateStr = year + '/' + month + '/' + shift6List[i]; Logger.log(dateStr); var date = new Date(dateStr); Logger.log(date); createEvent(CALENDAR_ID, SHIFT6, date, SHIFT6_START_TIME, SHIFT6_END_TIME); Logger.log('createEvent() is done.'); } // シフト7を登録 for (var i = 0; i < shift7List.length; i++) { var dateStr = year + '/' + month + '/' + shift7List[i]; Logger.log(dateStr); var date = new Date(dateStr); Logger.log(date); createEvent(CALENDAR_ID, SHIFT7, date, SHIFT7_START_TIME, SHIFT7_END_TIME); Logger.log('createEvent() is done.'); } // シフト8を登録 for (var i = 0; i < shift8List.length; i++) { var dateStr = year + '/' + month + '/' + shift8List[i]; Logger.log(dateStr); var date = new Date(dateStr); Logger.log(date); createEvent(CALENDAR_ID, SHIFT8, date, SHIFT8_START_TIME, SHIFT8_END_TIME); Logger.log('createEvent() is done.'); } } // カレンダーに終日のイベントを作成 function createEvent(calendarId, title, date, startTime, endTime) { var calendar = CalendarApp.getCalendarById(calendarId); //calendar.createAllDayEvent(title, date); var startDateTime = new Date(date.getFullYear(), date.getMonth(), date.getDate(), Number(startTime.split(':')[0]), Number(startTime.split(':')[1])); var endDateTime = new Date(date.getFullYear(), date.getMonth(), date.getDate(), Number(endTime.split(':')[0]), Number(endTime.split(':')[1] )); Logger.log('startDateTime'); Logger.log(startDateTime); Logger.log('endDateTime'); Logger.log(endDateTime); calendar.createEvent(title, startDateTime, endDateTime); } |
注意点1 自分のGmailを入力
「var CALENDAR_ID = ‘~@gmail.com’;」の部分は自分のGmailアドレスを入力する。
もちろんGoogleドライブと関連付けているGmailアドレス。
注意点2 勤務パターン数を変更する
ここではシフトパターンを8つ設定した場合のコードを掲載している。
もし5つや6つであれば、不必要な部分を削除するだけでOK
8以上だと、コードのパターンを学習し、必要分を自分でコピペ&変更する必要がある。
注意点3 勤務時間・勤務パターン名を変更する
「var SHIFT1 = ‘早番A’;」 に自分がGoogleフォームで作成した勤務名を入力する。
「var SHIFT1_START_TIME = ‘7:00’;」 に勤務開始時間を入力。
「var SHIFT1_END_TIME = ’16:00’」 に勤務終了時間を入力。
注意点4 夜勤など日をまたぐ時間帯を設定する
var SHIFT8 = ‘夜勤’;
var SHIFT8_START_TIME = ’16:00′;
「var SHIFT8_END_TIME = ’33:30’」のように「24時間+終了時間」を計算した数値を入力する。この例では、次の日の9時半に終了するので24+9時半で33:30となる。
注意点5 表記は統一する
本記事のコードをコピペして利用するユーザーは問題ないが、
元記事ではコードを「SHIFT1」でコーディングしていたのに、追加記事ではコードを「SHIFT1_NAME」に変更している。
参考Googleカレンダーにシフトを簡単に時間帯付きで登録する – まだ中学生のブログ
元記事ベースで「コピペをしてうまくいかない!?」という人は自分がコピペしたコードがちゃんと統一されてるか確認しよう!
SHIFT1で表記を統一するか、SHIFT1_NAMEで統一しなければならない。
<5>トリガーを設定
時計のようなマークをクリック
今すぐ追加
トリガーの設定
実行の項目はコードを書かないとmy Functionしか選択できないので、必ず、コードをコピペしてからトリガーを設定すること。
<6>エラーが出ないならカレンダー確認
Googoleカレンダーアプリを確認してみよう。
<7>プログラム修正・追加した場合
注意点 実行>executeInPostingは無闇に連打しない!
実行>executeInPostingは1度クリックするたびに、1ヶ月分のスケジュールが追加されてしまう(正常に動作している部分は反映されてしまう)
一度登録されているスケジュールとは、別スケジュール扱いで二重に登録されてしまう。
プログラムが全く動いてなければ何度実行させても害はないが、中途半端に動いているときは注意が必要。
特に、終日設定でプログラムを書いて実行していたものを、時間帯表示できるようにプログラムを書き換えて実行すると、終日のスケジュールと時間帯表示のスケジュールが混在する。
削除は簡単にできるが、できれば面倒な作業は増やしたくない。
時間帯が表示されるシフトを組みたければ最初からそのプログラムを書いて実行すべし!
(ここで紹介したコードは時間帯表示されるものです。)
この記事をブログ等で紹介する際は下のHTMLコードをコピペしてお使い下さい。
泣いて喜びます。
<a href="http://49hack.jp/googlecalendar-shifuto/">Googleカレンダーで変則シフトを簡単に登録する方法を実践!初心者用に解説・注意点</a>
コメント
こんにちは。
記事を参考に登録してみましたが、コードをコピペしたところ
for-loop コントロールの後に ) がありません。(行 72、ファイル「コード」)
とのエラーがでます。
どこを修正したらよいでしょう??
僕の使っているスプレッドシートのスクリプトを確認したところ
72行目
for (var i = 0; i < shift1List.length; i++) {
が正しいコードでした。「<」をHTMLで→「<」とコードしていたのが間違いで、コピペしても正常に動作しない状態でした。 2016年3月8日に修正済みのコードを掲載し、記事を更新しました。 指摘がないと気づかないままでした。 ありがとうございます。
ご回答、修正ありがとうございます!無事にシフトの登録ができました!
大変助かりました・ありがとうございました。
早速試させていただいてます!
分かりやすく記載頂き感謝です。
ところで一つ質問なんですが、
シフトに場所を追加で指定する場合、
どのようにスクリプトを弄ればいいでしょうか?
自分なりに調べてlocationコマンドを入れたりしたんですが
サッパリで。。
よろしくお願い致します。
コードの知識はまるでないので元記事の製作者に直接聞いてみてはいかがでしょうか。
こんにちは。管理人様の記事を参考に、自分でも試してみましたが、「トリガーの設定」でつまづいてしまいました。
コードを書いた後、「実行」のところで、「my Function」しか選択できず、「executeInPosting」が選択できません。そのせいだと思いますが、アンケートフォームに回答をしてもgoogleカレンダーに反映されません。
「executeInPosting」をどうすれば選択できるか、お忙しい所恐縮ですが、ご教示願います。
コードをコピペしたから「実行」すればexecuteInPostingが選択できたと思います。
この記事に変わる新しいシフト入力方法の記事を近日公開する予定なので、この記事の方法がうまくできない場合は試してみてください。
例えば
ひと月に全ての勤務があれば問題なく登録されましたが
早番が無い月をチェックなしで回答すると
1日にシフトが登録されてしまします。
私も1日?だったかバグみたいに反映されてしまうことがありました。どこかのコードが間違っているのかな?
はじめまして。
変則シフト勤務しています。
今までアプリでシフト管理していましたが、googleカレンダーとどうにか同期をしたいと探していたところ、こちらに辿り着きました。
然しながらIT音痴の私は中々理解出来ないのです。
説明頂いているのはPCでの作成なのでしょうか?
スマホで挑戦しているのですが、表記が微妙に違うようで・・・
セクションの追加で早々に躓いてしまいました
「新しいシフト入力方法の記事を近日公開する予定」とありますがもっとシンプルになってますでしょうか?
是非ご教授頂きたいと思っています。
連日変則勤務でお疲れかとは思いますが、どうぞよろしくお願い致します。
この記事のやり方だと、操作ミスで項目などを追加しようとしてしまうと、取り消してもエラーになってしまい1からやり直さないといけません。
他のブログで公開されていたシートを使って現在は多少手間がかかる方法を使っています。
体調のお気遣いありがとうございます。miinoさんが楽にシフト管理できるように新シフト入力をいつか記事にしますね。
(子育ててでなかなか時間が持てず申し訳ないです・・・)