🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google スプレッドシート

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

Google フォーム

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

Google カレンダー

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

Google Apps Script

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

1回答

2762閲覧

GAS フォームとカレンダーで予約システムを作りたい ホテル用

bavivi

総合スコア2

Google スプレッドシート

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

Google フォーム

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

Google カレンダー

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

Google Apps Script

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

1クリップ

投稿2021/03/02 10:18

編集2021/03/02 10:22

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
現在ホテルの予約システム用にフォームで入力した内容
をスプレッドシートからカレンダー連携でカレンダーで管理したいと思っていますが、
フォームの複数の項目(人数や料理コース名など)をカレンダーに反映させたいのですがうまく
カレンダーに反映されません。
また1日以上の予定をカレンダーに反映させたいのですがそちらもうまくいきません。
初心者で見よう見まねでいろいろ調べたんですが、検索でいい回答が得られないです。
宜しくお願い致します

該当のソースコース

function sendToCalendar(e) {
try{
//有効なGooglesプレッドシートを開く
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

//新規予約された行番号を取得
var num_row = sheet.getLastRow();

//新規予約された行から名前を取得
var nname = sheet.getRange(num_row, 3).getValue();

//部屋の取得
var nname = sheet.getRange(num_row,3).getValue();

//予約を記載するカレンダーを取得
var cals = CalendarApp.getCalendarById("カレンダーID");

//予約の開始時間を取得
var stime = new Date(sheet.getRange(num_row, 7).getValue());

//予約の終了時間を取得
var etime = new Date(sheet.getRange(num_row, 9).getValue());
//取得開始日
var startDate=new Date(sheet.getRange(num_row, 6).getValue());
//取得終了日
var endDate=new Date(sheet.getRange(num_row, 8).getValue());
var ndate = new Date(sheet.getRange(num_row, 6).getValue());
var ndates= new Date(ndate.getFullYear(),ndate.getMonth(),ndate.getDate(6),stime.getHours(),stime.getMinutes(),0);
var ndatee= new Date(ndate.getFullYear(),ndate.getMonth(),ndate.getDate(8),etime.getHours(),etime.getMinutes(),0);

var options = {
description: sheet.getRange(num_row,3,11).getValues(),
location: sheet.getRange(num_row,2).getValue(),
}

// 先約があるかどうか調べる
if(cals.getEvents(ndates, ndatee)==0){

var thing = nname+"様 ご予約";

//予約情報をカレンダーに追加
var r = cals.createEvent(thing, ndates, ndatee);
var thing =nname+"様 \n\n ご仮予約を承りました。\n 別途、確定のお知らせをいたします。\n\n ありがとうございました"

MailApp.sendEmail(nmail,"仮ご予約",thing);
}
else{
var thing =nname+"様 \n\n ご予約の時間に先約がありましたので、\n 申し訳ございませんが、ご予約いただけませんでした。\n\n ご予定を変更して再度お申込みください"

MailApp.sendEmail(nmail,"ご予約できませんでした",thing);
}

} catch(exp){
//実行に失敗した時に通知
MailApp.sendEmail(nmail, exp.message, exp.message);
}
}

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

これがすべての問題かわかりませんが

javascript

1//新規予約された行から名前を取得 2var nname = sheet.getRange(num_row, 3).getValue(); 3 4//部屋の取得 5var nname = sheet.getRange(num_row,3).getValue();

部屋と予約名が同じ値になるのでエラーになると思います。

それと余計なお世話かもしれませんが、こちらのフォームで予約する際、現在の予約状況などはカレンダー等でお客様から見られるようになっているのでしょうか?フォーム入力→予約入ってました再検討してください→入力→予約入ってました・・・というのはお客様目線で考えたとき、ストレスかもしれません。

投稿2021/03/03 13:25

gatten1217

総合スコア59

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

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

bavivi

2021/03/03 21:34

ありがとうございます。修正いたしました。またお客様へのメール対応のアドバイスまで誠にありがとうございます。今回はお客様へのではなく従業員共有用として使うつもりです。 複数のフォームの項目をカレンダーの説明欄にいれる方法がわかりません。
gatten1217

2021/03/04 04:08 編集

従業員の方が入力されるのであれば問題ないですよね。私もいま予約システムを素人ながら作ろうとしているので、参考にさせていただきます。 ご質問のdescriptions部分の sheet.getRange(num_row,3,11).getValues()でデータを取得しようとすると・・・ 仮に最終行(num_row)が26行目だとすると、C26から11行下方向、つまりC36までのデータ(空白セル)を取ろうとしています。たぶんbaviviさんが実行しようとしている意図とは異なった動きかと思います。 実際にどこのデータが欲しいのか教えていただけますか
bavivi

2021/03/15 09:21

お返事大変遅くなり申し訳ございません。 sheet.getRange(num_row,3,11).getValues()でデータを取得しようとすると・・・ 仕組みがよくわからずこちらスプレッドシートでいう所の列A、B、Cなどにあたる横方向での複数セルの情報をカレンダーの説明欄に出力したいのですが、複数の列の情報を抽出することはできないのでしょうか?フォームで入力するとスプレッドシートに各項目が列ごとに分かれて表示されるので、
bavivi

2021/03/15 09:32

function sendToCalendar(e) { try{ //有効なGooglesプレッドシートを開く var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); //新規予約された行番号を取得 var num_row = sheet.getLastRow(); //新規予約された行から名前を取得 var nname = sheet.getRange(num_row, 7).getValue(); //メールアドレスの取得 var nmail = sheet.getRange(num_row, 9).getValue(); //予約を記載するカレンダーを取得 var cals = CalendarApp.getCalendarById("c_04ibpvr2u2tkl7udujcktp59v0@group.calendar.google.com"); //予約の開始時間を取得 var stime = new Date(sheet.getRange(num_row, 3).getValue()); //予約の終了時間を取得 var etime = new Date(sheet.getRange(num_row, 5).getValue()); //予約者の所属部署名・予約場所を取得 var options = { location : (sheet.getRange(num_row,6).getValue()), description : (sheet.getRange(num_row,8).getValue()) } var ndate = new Date(sheet.getRange(num_row, 2).getValue()); var ndates= new Date(ndate.getFullYear(),ndate.getMonth(),ndate.getDate(),stime.getHours(),stime.getMinutes(),0); var ndatee= new Date(ndate.getFullYear(),ndate.getMonth(),ndate.getDate(),etime.getHours(),etime.getMinutes(),0); // 先約があるかどうか調べる if(cals.getEvents(ndates, ndatee)==0){ var thing = nname+"様 ご予約"; //予約情報をカレンダーに追加 var r = cals.createEvent(thing, ndates, ndatee, options); var thing =nname+"様 \n\n ご予約を承りました。" MailApp.sendEmail(nmail,"ご予約",thing); } else{ var thing =nname+"様 \n\n ご予約の時間に先約がありましたので、\n 申し訳ございませんが、ご予約いただけませんでした。\n\n ご予定を変更して再度お申込みください。" MailApp.sendEmail(nmail,"ご予約できませんでした",thing); } } catch(exp){ //実行に失敗した時に通知 MailApp.sendEmail(nmail, exp.message, exp.message); } } 今現段階で上記のコードで試してみたのですが、現在予約開始日は反映させることができたのですが 予約終了日を組み込むコードがわかりません。ちなみに終了日はスプレッドシートのD列の情報を取ってきたいです。 あとdescriptions部分にH~Kの列の情報を複数とってきたいのですが、、
gatten1217

2021/03/16 13:20 編集

↓これで開始日を取得しているので var ndate = new Date(sheet.getRange(num_row, 2).getValue());//開始日(B列) ↓これで終了日が取れると思います。 var eDate = new Date(sheet.getRange(num_row, 4).getValue());//終了日(D列) そして、ndateeは終了日の年月日を取得したいとおもうので↓のように書き換えます var ndatee= new Date(eDate.getFullYear(),eDate.getMonth(),eDate.getDate(),etime.getHours(),etime.getMinutes(),0); これで終了日が取れるか試してみてください。 つぎにdescriptionsですが、複数列のデータを取ることは可能です。 H~K列の最下行を取得するには↓でまずデータを取得します。 var values = sheet.getRange(num_row,8,1,4).getValues(); この時点ではvaluesは二次元配列 [[H列データ,I列,J列,K列]] という形で収まっています。 values[0]にすると一次元配列 [H列データ,I列,J列,K列] になります。 このあと取得したデータをどう並べたいかによりますが、配列内の文字列を結合するには、.join()が使いやすいです。 var descriptions = values[0].join("\n") こうすると、 H列データ I列 J列 K列 といった具合に文字列が開業された状態で取得されます。 var descriptions = values[0].join("") の場合は、 H列データI列J列K列 と、各文字列が隙間なく並びます。 join()のように引数を与えない場合は、 H列データ,I列,J列,K列 各文字列の間にカンマが入ります。 こんな感じでどうでしょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問