前提
GASでスプレッドシートの表の決定日時欄の日付からGoogleカレンダーに予定が追加される
システムを作っております。(初心者で色々な方のブログなどを拝見し作ってます)
下記質問です。
実現したいこと
・自動実行
現在、メニューからカレンダー連携ボタンを押して実行しているが、
D列に「確認中」と入力(特定列の編集)した時点で実行するようにしたい。

発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
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() // 予定の一覧をバッファに取得 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 } // 値をセット 日時はフォーマットして保持 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='相談'; } // 対面、かつ模擬面接ではない、同じ時間帯に対面の予定が無いか判定 if(title2 == '対面' && title !== '模擬面接' && decisionDate == decisionDate){ title2 = '対面②' } else { title2 = '対面①' } // 予定を作成 calendar.createEvent( title2+title+")"+studentNumber, startDate, endDate, options ) } //予定が作成されたら「済」にする sheet.getRange(topRow + i, statusCellCol+1).setValue("済") // エラーの場合ログ出力する } catch (e) { Logger.log(e) } } }
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。

0 コメント