前提
下記のスプレッドシートから、カレンダーに予定を追加する機能を作成しました。
D列(状況欄)が確認中の時、カレンダー連携から実行すると、
自分のカレンダーにC列(決定日時)の日付の予定が追加されるようになっております。
(T列(実行判定)が済の時は追加しません。)
実現したいこと
予定が追加される際に、I列(相談方法)+H列(相談内容)+’)’+E列(学生番号)
がタイトルとして追加されますが、
条件:C列(決定日時欄)が同じ日付と時間があるとき(10行目と11行目)の時は
相談方法の後ろに②をつける(例:対面②)のようにしたいです。
よろしくお願いいたします。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
function onOpen() { SpreadsheetApp.getActiveSpreadsheet().addMenu('カレンダー連携',[ {name:'実行',functionName:'reserveOnCalendar'}, ]); } function reserveOnCalendar() { // googleカレンダーの取得 const calendar = CalendarApp.getDefaultCalendar() // 読み取り範囲(表の始まり行と終わり列) const topRow = 2 const lastCol = 20 // 予定の一覧バッファ内の列(0始まり) const statusNum = 3 //状況 const manager = 1 //担当 const dayNum = 15 //日付抜出 const startNum = 17 //開始時間 const endNum = 18 //終了時間 const titleNum = 7 //相談内容 const title2Num = 8 //相談方法 const studentNum = 4 //学籍番号 const descriptionNum = 13 //メールアドレス const statusCellCol = 19 //実行判定 const decisionDateNum = 2 //決定日時 // シートを取得 const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // 予定の最終行を取得 let lastRow = sheet.getLastRow() //①列の先頭行から下方向に取得する var lastRow1 = sheet.getRange(1, 1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); // 予定の一覧をバッファに取得 const contents = sheet.getRange(topRow, 1, sheet.getLastRow(), lastCol).getValues() // ログイン情報取得 let user = Session.getActiveUser(); // スクリプトの実行者を取得 let contact = ContactsApp.getContact(user); // 実行者の連絡帳データを取得 let familyName = contact.getFamilyName(); // 姓(苗字)のみ // 順に予定を作成 for (let i = 0; i <= lastRow - topRow; i++) { //「確認中以外か、判定が済か、担当が自分以外」の場合は無視する if (contents[i][statusNum] !== "確認中" || contents[i][statusCellCol] == "済" || contents[i][manager] !== familyName) { continue } //「メールか電話」の場合は無視する if (contents[i][title2Num] == "メール" || contents[i][title2Num] == "電話" ) { continue } // 値をセット 日時はフォーマットして保持 let decisionDate = contents[i][decisionDateNum] let day = contents[i][dayNum] let startTime = contents[i][startNum] let endTime = contents[i][endNum] let title = contents[i][titleNum] let title2 = contents[i][title2Num] let studentNumber = contents[i][studentNum] let options = {description: contents[i][descriptionNum] } // 詳細をセット try { // 開始終了時刻が無ければ終日で設定 if (startTime == '' || endTime == '') { //相談内容の複数あるか判定 if(title.indexOf(',') != -1){ title='相談'; } // 予定を作成 calendar.createAllDayEvent( title2+title+")"+studentNumber, day, options ) // 開始終了時刻があれば範囲で設定 } else { // 開始日時を作成 let startDate = new Date(day) startDate.setHours(startTime.getHours()) startDate.setMinutes(startTime.getMinutes()) // 終了日時を作成 let endDate = new Date(day) endDate.setHours(endTime.getHours()) endDate.setMinutes(endTime.getMinutes()) // 相談内容の複数あるか判定 if(title.indexOf(',') != -1){ title='相談'; } // 決定日時の検索 var values=sheet.getRange("C2:C9999").getValues(); var value={}; for (let i = 0; i <= lastRow; i++) { value[i] = values[i]; // 対面、かつ模擬面接ではない、同じ時間帯に対面の予定が無いか判定 if(title2 == '対面' && title != '模擬面接' && decisionDate == value[i]){ title2 = '対面②'; } else if(title2 == '対面' && title != '模擬面接' && decisionDate != value[i]) { title2 = '対面①'; } else { } } // 予定を作成 calendar.createEvent( title2+title+")"+studentNumber, startDate, endDate, options ) } //予定が作成されたら「済」にする sheet.getRange(topRow + i, statusCellCol+1).setValue("済") // エラーの場合ログ出力する } catch (e) { Logger.log(e) } } }
試したこと
var values=sheet.getRange("C2:C9999").getValues(); var value={}; for (let i = 0; i <= lastRow; i++) { value[i] = values[i]; // 対面、かつ模擬面接ではない、同じ時間帯に対面の予定が無いか判定 if(title2 == '対面' && title != '模擬面接' && decisionDate == value[i]){ title2 = '対面②'; } else if(title2 == '対面' && title != '模擬面接' && decisionDate != value[i]) { title2 = '対面①'; Browser.msgBox(lastRow) } else { } }
//上記のように書いたのですが、For文がうまく回っておらず理想通りに動いてくれません。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー