前回はGoogleスプレッドシートを使ってGoogleカレンダーに予定をワンクリックで追加・削除するということを紹介いたしました。
今回はお待ちかね、第三弾!
前回は、Googleカレンダーに日々の予定を一括で追加、削除できたら便利ということで、そういうスクリプトを書いてみたわけです。
今回は、それが複数名に一気に反映されたら嬉しいよねということで、日々の予定を一括で複数名のカレンダーに追加、削除できるようなものを作ってみたいと思います。実はメールでアイデアをいただきまして、この度作成する運びとなりました。
手間のかかる作業とはおさらば!Googleスプレッドシートを使って日々の予定を一括でワンクリックで、指定したメンバー全員に、追加・削除する方法について解説していきたいと思います。
※尚、他人に迷惑をかけるような使い方は許可しません。
Google スプレッドシートを開く
Googleのサイトを開き、右上の3つの「…」をクリックして、下にスクロールして出てくる「スプレッドシート」を選択します。
スプレッドシートを開いて、「空白のスプレッドシート」を作成します。
新しいスプレッドシートが開けました。
表を作る
まず表を作成します。まずタイトルを付けます。「カレンダー追加・削除用(複数名対応版)」とでもしましょう。
カレンダーシートの基本設定
次にシート名も変更しておきます。わかりやすく「カレンダー」とでも付けておくとよいでしょう。行番号と列番号に気をつけて表を作成してください。
前回のデータを使いまわししているので、追加・削除ボタンが既に付いていますが気にしないで下さい。
「9行目」に「連携」「日付」「曜日」「開始時間」「終了時間」「タイトル」「場所」「説明」の項目を作り、幅や色、枠線などを付けて成形します。
メールアドレスシートの基本設定
カレンダーを登録するユーザーの「メールアドレス」も登録します。メールアドレスは新しいシートを開き、シート名を「メールアドレス」と変更しておきます。
図のようにタイトルを記述して、A2からA3、A4…とメールアドレスを記述していきます。A列だけが必要なので、B列などの情報は適当で構いません。また、登録できるメールアドレスの数はほぼ無限となっています。
拡張機能を使ってプログラムを組み込む
メインプログラム
「拡張機能」>「Apps Script」を開きます。
「無題のプロジェクト」が開きます。タイトルを変更して「カレンダー追加・削除用マクロ」とでもしておいてください。
次の文章をコピペします。※2024/09/14 19:38修正(既存のスプレッドシートに追加対応版)
/**
* 予定を作成する
*/
function createSchedule() {
// 初期設定
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet = spreadsheet.getSheetByName('カレンダー');
const sheet_mailaddress = spreadsheet.getSheetByName('メールアドレス');
// 変数宣言
let status;
let day;
let startTime;
let endTime;
let title;
let options;
let startDate;
let endDate;
// 配列宣言
const range = new Array();
const gAccount = new Array();
const calendar = new Array();
let contents = new Array();
// 連携するアカウント
let i = 0; // カウント用
let j = 0; // カウント用
while (sheet_mailaddress.getRange(i + 2, 1).isBlank() === false) {
range[i] = sheet_mailaddress.getRange(i + 2, 1); // メールアドレスシート:A行 の範囲を取得する
gAccount[i] = range[i].getValue(); // 取得したシートからメールアドレスを取得する
i++;
}
let roop = i; // メールアドレスの数を取得
// 読み取り範囲(表の始まり行と終わり列)
const topRow = 10; // 10行目が開始行
const lastCol = 9; // 9列目まで読み取る
// 0始まりで列を指定しておく
const statusCellNum = 1;
const dayCellNum = 2;
const startCellNum = 4;
const endCellNum = 5;
const titleCellNum = 6;
const locationCellNum = 7;
const descriptionCellNum = 8;
// 予定の最終行を取得
let lastRow = sheet.getLastRow();
// 予定の一覧を取得
contents = sheet.getRange(topRow, 1, sheet.getLastRow(), lastCol).getValues();
// 複数名分のカレンダーカウント用
for (i = 0; i < roop; i++) {
// googleカレンダーの取得
calendar[i] = CalendarApp.getCalendarById(gAccount[i]);
// 順に予定を作成(今回は正しい値が来ることを想定)
for (j = 0; j <= lastRow - topRow; j++) {
//「済」または「空白」の場合は飛ばす
status = contents[j][statusCellNum];
if (
status == "済" ||
status == "済み" ||
contents[j][dayCellNum] == ""
) {
continue;
}
// 値をセット 日時はフォーマットして保持
day = new Date(contents[j][dayCellNum]);
startTime = contents[j][startCellNum];
endTime = contents[j][endCellNum];
title = contents[j][titleCellNum];
// 場所と詳細をセット
options = {location: contents[j][locationCellNum], description: contents[j][descriptionCellNum]};
try {
// 開始終了が無ければ終日で設定
if (startTime == '' || endTime == '') {
//予定を作成
calendar[i].createAllDayEvent(
title,
new Date(day),
options
);
// 開始終了時間があれば範囲で設定
} else {
// 開始日時をフォーマット
startDate = new Date(day);
startDate.setHours(startTime.getHours());
startDate.setMinutes(startTime.getMinutes());
// 終了日時をフォーマット
endDate = new Date(day);
endDate.setHours(endTime.getHours());
endDate.setMinutes(endTime.getMinutes());
// 予定を作成
calendar[i].createEvent(
title,
startDate,
endDate,
options
);
}
//無事に予定が作成されたら「済」にする
sheet.getRange(topRow + j, 2).setValue("済");
// エラーの場合(ログ出力のみ)
} catch(e) {
Logger.log(e);
}
}
}
// ブラウザへ完了通知
Browser.msgBox("追加完了");
}
/**
* 予定を削除する
*/
function deleteSchedule() {
// 初期設定
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet = spreadsheet.getSheetByName('カレンダー');
const sheet_mailaddress = spreadsheet.getSheetByName('メールアドレス');
// 変数宣言
let status;
let day;
// 配列宣言
const range = new Array();
const gAccount = new Array();
const calendar = new Array();
let contents = new Array();
// 連携するアカウント
let i = 0; // カウント用
let j = 0; // カウント用
while (sheet_mailaddress.getRange(i + 2, 1).isBlank() === false) {
range[i] = sheet_mailaddress.getRange(i + 2, 1); // メールアドレスシート:A行 の範囲を取得する
gAccount[i] = range[i].getValue(); // 取得したシートからメールアドレスを取得する
i++;
}
let roop = i; // メールアドレスの数を取得
// 読み取り範囲(表の始まり行と終わり列)
const topRow = 10; // 10行目が開始行
const lastCol = 3; // 3列目まで読み取る
// 0始まりで列を指定しておく
const statusCellNum = 1;
const dayCellNum = 2;
// 予定の最終行を取得
let lastRow = sheet.getLastRow();
//予定の一覧を取得
contents = sheet.getRange(topRow, 1, sheet.getLastRow(), lastCol).getValues();
// 複数名分のカレンダーカウント用
for (i = 0; i < roop; i++) {
// googleカレンダーの取得
calendar[i] = CalendarApp.getCalendarById(gAccount[i]);
//順に予定を作成(今回は正しい値が来ることを想定)
for (j = 0; j <= lastRow - topRow; j++) {
//「済」または「空白」の場合は飛ばす
let status = contents[j][statusCellNum];
if (
status == "済" ||
status == "済み" ||
contents[j][dayCellNum] == ""
) {
continue;
}
// 値をセット 日時はフォーマットして保持
day = new Date(contents[j][dayCellNum]);
try {
//予定を作成
event = calendar[i].getEventsForDay(
new Date(day)
);
event[0].deleteEvent();
//無事に予定が作成されたら「済」にする
sheet.getRange(topRow + j, 2).setValue("済");
// エラーの場合(ログ出力のみ)
} catch(e) {
Logger.log(e);
}
}
}
// ブラウザへ完了通知
Browser.msgBox("削除完了");
}
コピペし終わったら、「プロジェクトを保存」しておきます。
jsonファイルの設定
次に、Googleカレンダーへの実行権限を許可するためにjsonファイルの編集を行います。jsonファイルを編集するには、下図の左にある設定歯車ボタンをクリックして、「appsscript.json」マニフェスト ファイルをエディタで表示するにチェックを入れます。
そして、以下の文章をappsscript.jsonsに書き込みます。appsscript.jsonsファイルは、<>をクリックしたところにあります。
{
"timeZone": "Asia/Tokyo",
"dependencies": {
},
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8",
"oauthScopes": [
"https://www.googleapis.com/auth/script.external_request",
"https://www.googleapis.com/auth/spreadsheets",
"https://www.googleapis.com/auth/forms",
"https://www.googleapis.com/auth/calendar"
]
}
コピペが終わったら、保存をしておいてください。
実行用のボタンを設置する(追加・削除)
ボタンを作成する
前回のスプレッドシートを使用した方は、ボタンの移動程度で特に作成の必要はありません。ちなみに、ボタンはCTRLを押してボタンをクリックした後に移動させられます。
まず実行用のボタンを作成します。メニューバーの「挿入」>「図形描画」をクリックします。
「図形」「テキストボックス」を駆使して、「追加」「削除」の実行ボタンを作成します。作成が終わったら、「保存して終了」をクリックします。※ご自身でわかればいいので、どんなボタンでも構いません。
ボタンを設置する
「保存して終了」をクリックすると、自動で表にボタンが設置されますので、クリックしやすい位置に場所を移動し、大きさも調整してください。
ボタンにマクロを追加する(追加用マクロ)
実行ボタンの右上に縦に「…」マークがあるのがわかるかと思います。
「…」マークをクリックし、「スクリプトを割り当て」をクリックします。
スクリプトを割り当てる画面になりますので、「createSchedule」と入力して「確定」をクリックしてください。
これで追加用の実行ボタンの設置ができました。※一度マクロを登録した実行用ボタンを移動したい場合は、CTRLを押しながらボタンをクリックすることで移動可能になります。
ボタンにマクロを追加する(削除用マクロ)
実行ボタンの右上に縦に「…」マークがあるのがわかるかと思います。
「…」マークをクリックし、「スクリプトを割り当て」をクリックします。
スクリプトを割り当てる画面になりますので、「deleteSchedule」と入力して「確定」をクリックしてください。
これで削除用の実行ボタンの設置ができました。※一度マクロを登録した実行用ボタンを移動したい場合は、CTRLを押しながらボタンをクリックすることで移動可能になります。
ワンクリックで予定を組み込んでみる(初回だけの手順)
適当でも実務的でも良いので予定を記入してから、どちらでも良いので実行ボタンをクリックしてください。すると次のような許可画面が出ると思いますので、「OK」をクリックします。
次にアカウントの選択画面になりますので、アカウントを選択します。
すると次のような警告が出ますが、このプログラムをGoogleに登録をしているわけではない為、警告が出るのは当たり前なので、ここは無視して「詳細」をクリックします。
下に表示されるリンクの「カレンダー追加・更新用マクロ(安全ではないページ)に移動」をクリックします。
作成したマクロ「Google Apps Script(GAS)」を登録するので「許可」をクリックします。
このような面倒な許可が必要なのは一度目だけです。二度目以降は面倒な手続きはないので安心してください。
ワンクリックで予定を追加してみる
適当にデータを入れて登録をしてみます。
実行ボタンの「追加」ボタンをクリックすると、以下のような画面が出て、Google カレンダーに予定が組み込まれます。
Google カレンダーを見てみると、登録してあるメールアドレスすべてに予定が反映されます。
ワンクリックで予定を削除してみる
先程登録したデータを利用します。「連携」の部分に「済」という文字が入っていると思います。「済」という文字を消してから、「削除」の実行ボタンを押します。
実行ボタンの「削除」ボタンをクリックすると、以下のような画面が出て、Google カレンダーから予定が削除されます。
Google カレンダーを見てみると、登録されているすべてのメールアドレスに紐づいたカレンダーの予定が削除されます。
最後に
いかがでしたでしょうか?
追加・削除を複数のユーザーへ同時に反映させることができるようになりました。
ちなみにメールアドレスの数は無限に登録することができますが、管理しやすい範囲での作成をオススメいたします。(動作が劇的に遅くなるということではありません)
第三段も、大変便利となっておりますので、ご利用いただけると幸いです。
以下、この記事を書くにあたり、参考にしたサイトじゃ。
参考サイト
GASでGoogleカレンダーの予定を変更・削除する方法!件名や開始日・終了日(時間)を修正 | AutoWorker〜Google Apps Script(GAS)とSikuliで始める業務改善入門
Googleカレンダーの予定をすべてGASで削除する方法 | iwb.jp
Google Apps ScriptからGoogleカレンダーを削除する方法 | Kokoroe
スプレッドシートからGoogleカレンダーに予定を登録する方法(GAS) | Googleスプレッドシート 完全攻略
スプレッドシートからGoogleカレンダーに簡単に予定を登録する方法(初心者向け) | Googleスプレッドシート 完全攻略
スプレッドシートからカレンダーに連携してスケジュールを一括登録する【Google Apps Script(GAS)】 | 大阪のシステム開発なら 株式会社ウィズテクノロジー
【GAS】スプレッドシートに記載した予定をGoogleカレンダーにまとめて反映させたい #GAS - Qiita
GAS実行ユーザーのメールアドレス(Googleアカウント)を取得する方法 | AutoWorker〜Google Apps Script(GAS)とSikuliで始める業務改善入門
【Google Apps Script入門】セルの取得・変更をする | UX MILK
【GAS入門】変数/定数を宣言するvar・const・letの違い | Log Stocker
Googleスプレッドシートのスクリプト実行方法とボタンの実行方法 – Google Apps Script(GAS)を用いたシステム開発を支援
[GAS] シートを取得する方法
GASのwhile文の使い方解説!条件式がtrueの間くり返し処理し、無限ループに注意 | AutoWorker〜Google Apps Script(GAS)とSikuliで始める業務改善入門
GASのfor文の繰り返しループ処理とbreak、continueの使い分けを解説 | AutoWorker〜Google Apps Script(GAS)とSikuliで始める業務改善入門
【Google Apps Script入門】セルの取得・変更をする | UX MILK
【GAS】スプレッドシートif文セルの値の複数処理、空白かどうかisBlank()【Google Apps Script】 | スプレッドシートでGASる
[GASの使い方03]コンソール出力 | ITスキルアップ相談室
【GAS】配列の宣言・初期化・頻出メソッド
コメント