スプレッドシートとGoogleカレンダーを連携させて業務を効率化させよう★
Googleフォームで入力したモニタリングや支援経過を、Googleカレンダーに飛ばしたい!!!
フォームから直接連携させることはできないので、「フォーム」→「スプレッドシート」→「カレンダー」の手順で連携することで、フォームに入力した内容を、カレンダーに飛ばします。
「スプレッドシート」→「カレンダー」の連携
「Googleフォーム」→「スプレッドシート」「カレンダー」の連携 について解説していきます。
目標
スプレッドシートとカレンダーが連携できる
準備(必要な物)
・パソコン
・Googleアカウント
・スプレッドシートの簡単な操作(知識)
・カレンダーの操作(知識)
今回は、GASを使うので、これまでよりも少し難易度が高くなります💦
Googleが提供するスクリプト作成ツール:Googleスプレッドシート、Gmail、Googleカレンダーなど、Googleの各種サービスを自動化したり、連携させたりするためのプログラミング言語です。
JavaScriptをベース:Web開発でよく使われるJavaScriptをベースとしているため、比較的学びやすく、様々な処理を自動化することができます。
活用例:
スプレッドシートのデータを自動で集計・分析
Gmailのメールを自動で振り分け
カレンダーにイベントを自動で登録
複数のGoogleサービスを連携させて、業務効率化
連携したいGoogleカレンダーのIDを取得(確認)する
スプレッドシートから「拡張機能」「Apps Script」を開く
23行目の連携するカレンダーIDを入力して保存
「onOpen」を実行
スプレッドシートにデータを入力して「実行」
※ Googleフォームからのデータをカレンダーに連携させる使用にしているので、確認欄などを設定しています。
Googleカレンダーを開いて
マイカレンダー(左側のメニューの中)
└ 連携したいカレンダーを選択して右クリック
設定と共有 をクリック
カレンダー設定 が開くので
ズーッとしたの方
カレンダーの統合
└ カレンダーID
カレンダーIDをコピー
メインカレンダーの場合はGoogleID、それ以外の場合は長いID(アドレス)
「コピーを作成」
をクリックすると、マイドライブの中にコピーされます。
添付の Apps Script ファイルと機能もコピーされます。
メニューバーから「拡張機能」
「Apps Script」をクリックして Apps Script を起動
23行目の「カレンダーID」を
連携したカレンダーIDに変更
メニューバーの「onOpen」を選んで
「実行」
「権限を確認」
アカウントを選択
「詳細」
「カレンダー連携に移動」
安全ではないページ でOK
一番下までスクロール
「許可」
onOpen を実行したことで
スプレッドシートのメニューバーに「カレンダー連携」が作成される
カレンダー連携「実行」をクリックすると
入力されたデータがカレンダーに連携される
連携に成功すると、B列「確認」に「済」が自動入力される
以後「済」がある行のデータは連携されない
A列 は タイムスタンプ(Googleフォーム)
B列 は カレンダー連携実行の確認
C列:年月日
D列:開始時間
E列:終了時間
F列:イベントタイトル
G列:場所
H列:詳細
スプレッドシート の
A列からH列までは崩さない ようにして
シートを編集する
スプレッドシート「ツール」
「新しいフォームを作成」
Googleフォームが起動
Googleフォーム 「回答」
「スプレッドシートで表示」
「既存のスプレッドシートを選択」
連携するスプレッドシートを選んで
「挿入」
左端のメニューバーにカーソルを置いて
メニューを開く
トリガーを選択して
「+トリガーを追加」
実行する関数、イベントの種類 を選択
実行する関数「createSchedule」
イベントの種類「フォーム送信時」
変更内容を確認して「保存」
トリガー追加のアカウントを選択
「詳細」
「カレンダー連携に移動」
安全ではないページ でOK
一番下までスクロール
「許可」
トリガーに追加できたことを確認して設置終了
「コピーを作成」
をクリックすると、マイドライブの中にコピーされます。
添付の Apps Script ファイルと機能もコピーされます。
紐づけている Googleフォーム もコピーされます。
Apps Script を開いて、カレンダーID の設定(変更)と、トリガーの設定(追加)を実施すれば、フォームからカレンダーが連携します。
/**
* スプレッドシート表示の際に呼出し
*/
function onOpen() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
//スプレッドシートのメニューにカスタムメニュー「カレンダー連携 > 実行」を作成
var subMenus = [];
subMenus.push({
name: "実行",
functionName: "createSchedule" //実行で呼び出す関数を指定
});
ss.addMenu("カレンダー連携", subMenus);
}
/**
* 予定を作成する
*/
function createSchedule() {
// 連携するアカウント
const gAccount = "カレンダーID"; // ★★ここに連携するカレンダーのアドレスを入れる
// 読み取り範囲(表の始まり行と終わり列)
const topRow = 2;
const lastCol = 100;
// 0始まりで列を指定しておく
const statusCellNum = 1;
const dayCellNum = 2;
const startCellNum = 3;
const endCellNum = 4;
const titleCellNum = 5;
const locationCellNum = 6;
const descriptionCellNum = 7;
// シートを取得
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
//終了時間の列のフォーマットを変更(時間形式に変更。終了時間のエラー処理)
sheet.getRange("D:D").activate();
sheet.getActiveRangeList().setNumberFormat('H:mm:ss');
sheet.getRange("E:E").activate();
sheet.getActiveRangeList().setNumberFormat('H:mm:ss');
// 予定の最終行を取得
var lastRow = sheet.getLastRow();
//予定の一覧を取得
var contents = sheet.getRange(topRow, 1, sheet.getLastRow(), lastCol).getValues();
// googleカレンダーの取得
var calender = CalendarApp.getCalendarById(gAccount);
//順に予定を作成(今回は正しい値が来ることを想定)
for (i = 0; i <= lastRow - topRow; i++) {
//「済」っぽいのか、空の場合は飛ばす
var status = contents[i][statusCellNum];
if (
status == "済" ||
status == "済み" ||
status == "OK" ||
contents[i][dayCellNum] == ""
) {
continue;
}
// 値をセット 日時はフォーマットして保持
var day = new Date(contents[i][dayCellNum]);
var startTime = contents[i][startCellNum];
var endTime = contents[i][endCellNum];
var title = contents[i][titleCellNum];
// 場所と詳細をセット
var options = {location: contents[i][locationCellNum], description: contents[i][descriptionCellNum]};
try {
// 開始終了が無ければ終日で設定
if (startTime == '' || endTime == '') {
//予定を作成
calender.createAllDayEvent(
title,
new Date(day),
options
);
// 開始終了時間があれば範囲で設定
} else {
// 開始日時をフォーマット
var startDate = new Date(day);
startDate.setHours(startTime.getHours())
startDate.setMinutes(startTime.getMinutes());
// 終了日時をフォーマット
var endDate = new Date(day);
endDate.setHours(endTime.getHours())
endDate.setMinutes(endTime.getMinutes());
// 予定を作成
calender.createEvent(
title,
startDate,
endDate,
options
);
}
//無事に予定が作成されたら「済」にする
sheet.getRange(topRow + i, 2).setValue("済");
// エラーの場合(今回はログ出力のみ)
} catch(e) {
Logger.log(e);
}
}
// ブラウザへ完了通知
Browser.msgBox("完了");
}
目的:スプレッドシートを開いた際に実行される関数です。
処理:
SpreadsheetApp.getActiveSpreadsheet():現在開いているスプレッドシートを取得します。
addMenu():スプレッドシートのメニューに「カレンダー連携」というカスタムメニューを作成し、その下に「実行」というサブメニューを作成します。
createSchedule():サブメニュー「実行」をクリックすると、この関数が呼び出されます。
目的:スプレッドシートのデータに基づいて、Googleカレンダーに予定を作成するメインの関数です。
処理:
・カレンダーアカウントの指定:gAccount 変数に連携したいカレンダーのメールアドレスを指定します。
・データ範囲の指定:topRow, lastCol, statusCellNum など、スプレッドシートから読み込むデータの範囲や各カラムの役割を定義します。
・シートの取得:getActiveSheet() で現在のシートを取得します。
・データの取得:getRange() と getValues() を使って、指定した範囲のデータを2次元配列として取得します。
・カレンダーの取得:CalendarApp.getCalendarById() で指定したメールアドレスのカレンダーを取得します。
・予定の作成:
・各行のデータ(日付、開始時間、終了時間、タイトルなど)を抽出し、
calender.createEvent() または calender.createAllDayEvent() を使って
カレンダーイベントを作成します。
・開始時間と終了時間が空欄の場合は終日のイベントとして作成します。
・イベント作成に成功すると、スプレッドシートのステータスを「済」に更新します。
・エラーが発生した場合、Logger.log() でエラーログを出力します。