実現したいこと
美容室で、美容師ごとの予約共有をgoogleカレンダーで行いたいです。
大元のカレンダーには、都合上「美容師全員」の予定が入ってしまうので、
「予定の説明」部分から「美容師の名前(佐藤)」を含むものを抜き出し、
別のカレンダー(佐藤のカレンダー)にコピーしたいと思っております。
発生している問題・分からないこと
エラー内容は下記の通りです。
エラーメッセージ
error
1Exception: The parameters (String,String,String) don't match the method signature for CalendarApp.Calendar.createEvent. 2myFunction @ コード.gs:53
該当のソースコード
function myFunction() { // カレンダーID var fromCalendarID = 'xxxxxxx@group.calendar.google.com'; // 個人カレンダー(元) var toCalendarID = 'xxxxxxx@group.calendar.google.com'; // 共有カレンダー(先) // スプレッドシート:シート名 var SHEET_NAME = '佐藤'; // スプレッドシート:開始位置 var RANGE = 1; // シート情報を取得 var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME); // シートを初期化 sheet.clear(); // 登録元のカレンダー情報を取得 var calendar = CalendarApp.getCalendarById(fromCalendarID); // 登録元カレンダーから翌月末日までの予定を取得 var today = new Date(); var schedules = calendar.getEvents(today, new Date(today.getFullYear(), today.getMonth() + 2, 0)); // 登録元の予定の中で「佐藤」の付いてる予定だけを出力する for(var index = 0; index < schedules.length; index++) { var range = RANGE + index; if(schedules[index].getDescription().indexOf("佐藤") != -1) { // 開始時間を出力 sheet.getRange(range, 3).setValue(schedules[index].getStartTime()); // 終了時間を出力 sheet.getRange(range, 4).setValue(schedules[index].getEndTime()); // 予定名を出力→*を削除 sheet.getRange(range, 5).setValue(schedules[index].getDescription().replace("佐藤","")); } } // 登録先のカレンダー情報を取得 var tocalendar = CalendarApp.getCalendarById(toCalendarID); // 登録先カレンダーから翌月末日までの予定を取得 var toschedules = tocalendar.getEvents(today, new Date(today.getFullYear(), today.getMonth() + 2, 0)); // 既に登録されている予定の中で「佐藤」が付いてるやつを削除 for(var i = 0; i < toschedules.length; i++) { var eventname = toschedules[i].getDescription(); if(eventname.indexOf("佐藤") != -1){ toschedules[i].deleteEvent(); } } // 予定を再登録(タイトルに★を付ける) for(var i = 1; i <= sheet.getLastRow(); i++) { var cleateTitle = "★" + sheet.getRange(i, 5).getValue(); var cleateStart = sheet.getRange(i, 3).getValue(); var cleateEnd = sheet.getRange(i, 4).getValue(); var newevent = tocalendar.createEvent(cleateTitle, cleateStart, cleateEnd); } }
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
GASは、別の方が使用してOKとネットに公開しているものを一部書き換えました。元コードでは、「予定のタイトル」から「特定の文字」を含む予定を抽出してコピーするというものですが、上手くいきません。恐れ入りますが、ご教示ください。
補足
・この「全員分のカレンダー」から「美容師別」へのコピーを、名前別に10人分行いたいと考えています。
・実行されるタイミングが指定できるならば、毎日0:00にできると有難いです。
JavaとJavaScriptは全く別の言語です。
「Java」タグは外してください。
「Google Apps Script」・「Google カレンダー」・「Google スプレッドシート」等のタグを付けてください。
質問はいつでも何度でも編集できます。
var newevent = tocalendar.createEvent(cleateTitle, cleateStart, cleateEnd);
の cleateStart と cleateEnd が Date型 でないといけないのに対して String型 になってしまっている気がします。
カレンダーの予定を出力しているシートの3,4列目の表示形式を日時にした場合はどうなりますか?
コメントいただき、ありがとうございます。「カレンダーの予定を出力しているシートの3,4列目の表示形式を日時に」する修正について調べましたが、フォーマットの仕方がよく理解できませんでした。
不勉強でお手数をお掛けし申し訳ありませんが、どの部分をどのように直せばよいかご教示いただけますでしょうか。
確認ですが'佐藤'のシートに1行目から順にC列に開始日時 D列に終了日時 E列に説明 が出力されていますか?
されていればコードの最後のところを
var cleateStartValue = sheet.getRange(i, 3).getValue();
var cleateEndValue = sheet.getRange(i, 4).getValue();
// Dateオブジェクトに変換
var cleateStart = new Date(cleateStartValue);
var cleateEnd = new Date(cleateEndValue);
console.log(cleateStart);
console.log(cleateEnd);
var newevent = tocalendar.createEvent(cleateTitle, cleateStart, cleateEnd);
にして実行した場合に実行ログに
「Invalid Date」と表示されるところは日時として認識できていません。
丁寧に教えていただき、ありがとうございます。ご指摘いただいた点を確認したところ、1行目から予定が出力されていませんでした。私の力不足で教えていただいたことがコードに反映できなかったため、大変恐れ入りますがコードをすべて記載いただいて解決できた方のご回答をベストアンサーにさせていただきました。貴重なお時間を割いていただき、ありがとうございました。

回答1件
あなたの回答
tips
プレビュー