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

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

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

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

Google Apps Script

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

Q&A

解決済

1回答

569閲覧

GAS for文(配列あり)の書き方

Zigsow

総合スコア22

Google スプレッドシート

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

Google Apps Script

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

0グッド

0クリップ

投稿2022/09/08 00:06

前提

下記のスプレッドシートから、カレンダーに予定を追加する機能を作成しました。
イメージ説明

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/ツールのバージョンなど)

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

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

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

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

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

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

k.a_teratail

2022/09/09 02:07 編集

失礼しました。 こちらの確認不足になります。
Zigsow

2022/09/09 00:56

// 値をセット 日時はフォーマットして保持 let decisionDate = contents[i][decisionDateNum] というところで行っているつもりなのですがいかがでしょうか。
guest

回答1

0

自己解決

すいません、自己解決できたので解決済みにさせていただきます。ありがとうございました。

投稿2022/09/09 02:08

Zigsow

総合スコア22

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問