質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google カレンダー

Google カレンダーは、Google社が提供する無料のスケジュール管理ツールです。パソコンやスマートフォン、タブレットなどからアクセスし、スケジュールの追加・変更が可能。Googleアカウントがあれば誰でも使用できます。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

3回答

6000閲覧

GAS スケジュール重複防止

naokitchi

総合スコア3

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google カレンダー

Google カレンダーは、Google社が提供する無料のスケジュール管理ツールです。パソコンやスマートフォン、タブレットなどからアクセスし、スケジュールの追加・変更が可能。Googleアカウントがあれば誰でも使用できます。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2020/07/23 11:38

フォームスプレットシートカレンダーといった形で
予約したものがカレンダーに表示されるような仕組みとなっております。
イメージ説明

今のままだと、開始日、終了日、借りるもの(pcのmac)が重なったときにスケジュールに登録されてしまい、重複してしまいます。

大変恐縮なのですが、以下のコードを見てどのように修正すれば重複を避けることができるのか教えていただけないでしょうか?

コードに関してはいじっていただいても大丈夫です。

ソースコード
function createEventFromSheet() {
// 自分のカレンダーIDに置き換え
var myCal = CalendarApp.getCalendarById('c_m5tilsinfsn1c9djqdm74fegqc@カレンダーID');

var sheet = SpreadsheetApp.getActiveSheet();
var dat = sheet.getDataRange().getValues();

for(var i = 1; i < dat.length; i++) {
if (dat[i][1] != "") {
continue;
}
var title = dat[i][4];
var startDate = new Date(dat[i][2]);
var endDate = new Date(dat[i][3]);
var options = {
description: "" + dat[i][5] + "\n" + dat[i][6],
}

var myEvent = myCal.createEvent(title , startDate , endDate, options); dat[i][1] = "済";

}
sheet.getRange(1, 1, dat.length, dat[0].length).setValues(dat);
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

コメント欄と間違えました

投稿2020/07/24 10:55

編集2020/07/24 10:56
sawa

総合スコア3002

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こうでしょうか、、?

if(isDuplicated(myCal, title, startDate, endDate, options.description)) {
GmailApp.sendEmail(email, "タイトル", "本文");
dat[i][1] = "済";
continue;
}

function createEventFromSheet() {
// 自分のカレンダーIDに置き換え
var myCal = CalendarApp.getCalendarById('c_m5tilsinfsn1c9djqdm74fegqc@カレンダーID');

var sheet = SpreadsheetApp.getActiveSheet();
var dat = sheet.getDataRange().getValues();

for(var i = 1; i < dat.length; i++) {
if (dat[i][1] != "") {
continue;
}
var title = dat[i][4];
var startDate = new Date(dat[i][2]);
var endDate = new Date(dat[i][3]);
var options = {
description: "" + dat[i][5] + "\n" + dat[i][6],
}

var myEvent = myCal.createEvent(title , startDate , endDate, options);

dat[i][1] = "済";
}
sheet.getRange(1, 1, dat.length, dat[0].length).setValues(dat);
}

function isDuplicated(calendar, title, startDate, endDate, description) {
const startTime = startDate.getTime();
const endTime = endDate.getTime();
return calendar.getEventsForDay(startDate).some(event => {
if (event.getTitle() !== title) return false;
if (event.getStartTime().getTime() !== startTime) return false;
if (event.getEndTime().getTime() !== endTime) return false;
if (event.getDescription() !== description) return false;
return true;
});
}

投稿2020/07/24 10:31

naokitchi

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

フォームの説明を読む限り、スプレッドシートにはあるがカレンダーには無いケース(間違えて送信したためカレンダーから削除した場合)があるようなので、重複はカレンダーをチェックすればよいかと思います。

以下サンプルですが、未検証なので調整が必要かも。

JavaScript

1/** 2 * カレンダーに重複するイベントが登録済みか調べる。 3 * 4 * @param {GoogleAppsScript.Calendar.Calendar} calendar 重複チェックするカレンダー 5 * @param {string} title イベントタイトル 6 * @param {Date} startDate 開始日 7 * @param {Date} endDate 終了日 8 * @param {string} description 説明 9 * @returns {boolean} 重複する場合は true を、それ以外の場合は false を返す。 10 */ 11function isDuplicated(calendar, title, startDate, endDate, description) { 12 const startTime = startDate.getTime(); 13 const endTime = endDate.getTime(); 14 return calendar.getEventsForDay(startDate).some(event => { 15 if (event.getTitle() !== title) return false; 16 if (event.getStartTime().getTime() !== startTime) return false; 17 if (event.getEndTime().getTime() !== endTime) return false; 18 if (event.getDescription() !== description) return false; 19 return true; 20 }); 21}

使い方は、こんな感じで。

JavaScript

1 if(isDuplicated(myCal, title, startDate, endDate, options.description)) { 2 GmailApp.sendEmail(email, "タイトル", "本文"); 3 dat[i][1] = "済"; 4 continue; 5 } 6

投稿2020/07/24 08:57

draq

総合スコア2577

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sawa

2020/07/24 09:21

これ、たぶん備品の貸し出し管理がやりたいんだと思いますよ。
draq

2020/07/24 09:34

それだと何か問題ありますかね。
sawa

2020/07/24 09:45

開始、終了は一致だけでなく重なるケースの考慮が必要かなと。
draq

2020/07/24 09:56

それは要件に合わせてカスタマイズする問題じゃないかと思います。コピペで動かすことを目的に回答してるわけじゃないので。
naokitchi

2020/07/24 10:16

ご回答していただきありがとうございます! 2つコードがありますが、これはつなげてしまってよろしいのでしょうか、、? 言ってる意味がわからないかもしれないですがご回答していただけると幸いです。宜しくお願いします。 /** * カレンダーに重複するイベントが登録済みか調べる。 * * @param {GoogleAppsScript.Calendar.Calendar} calendar 重複チェックするカレンダー * @param {string} title イベントタイトル * @param {Date} startDate 開始日 * @param {Date} endDate 終了日 * @param {string} description 説明 * @returns {boolean} 重複する場合は true を、それ以外の場合は false を返す。 */ function isDuplicated(calendar, title, startDate, endDate, description) { const startTime = startDate.getTime(); const endTime = endDate.getTime(); return calendar.getEventsForDay(startDate).some(event => { if (event.getTitle() !== title) return false; if (event.getStartTime().getTime() !== startTime) return false; if (event.getEndTime().getTime() !== endTime) return false; if (event.getDescription() !== description) return false; return true; }); } if(isDuplicated(myCal, title, startDate, endDate, options.description)) { GmailApp.sendEmail(email, "タイトル", "本文"); dat[i][1] = "済"; continue; }
draq

2020/07/24 10:23

下のコードは元コードでcreateEventする前で使ってください。
naokitchi

2020/07/24 10:34

こうでしょうか、、? if(isDuplicated(myCal, title, startDate, endDate, options.description)) { GmailApp.sendEmail(email, "タイトル", "本文"); dat[i][1] = "済"; continue; } function createEventFromSheet() { // 自分のカレンダーIDに置き換え var myCal = CalendarApp.getCalendarById('c_m5tilsinfsn1c9djqdm74fegqc@カレンダーID'); var sheet = SpreadsheetApp.getActiveSheet(); var dat = sheet.getDataRange().getValues(); for(var i = 1; i < dat.length; i++) { if (dat[i][1] != "") { continue; } var title = dat[i][4]; var startDate = new Date(dat[i][2]); var endDate = new Date(dat[i][3]); var options = { description: "" + dat[i][5] + "\n" + dat[i][6], } var myEvent = myCal.createEvent(title , startDate , endDate, options); dat[i][1] = "済"; } sheet.getRange(1, 1, dat.length, dat[0].length).setValues(dat); } function isDuplicated(calendar, title, startDate, endDate, description) { const startTime = startDate.getTime(); const endTime = endDate.getTime(); return calendar.getEventsForDay(startDate).some(event => { if (event.getTitle() !== title) return false; if (event.getStartTime().getTime() !== startTime) return false; if (event.getEndTime().getTime() !== endTime) return false; if (event.getDescription() !== description) return false; return true; }); }
sawa

2020/07/24 10:57

draqさま 回答スタンスとのことで理解しました。 横から失礼いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問