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

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

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

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

Google Apps Script

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

Q&A

解決済

3回答

2699閲覧

GAS スプレッドシートの文字列を時間として取得してカレンダーにエクスポートしたい

riringo1110

総合スコア2

Google スプレッドシート

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

Google Apps Script

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

0グッド

3クリップ

投稿2021/10/23 06:29

前提・実現したいこと

GASでスプレッドシートの文字列を時間として取得してカレンダーにエクスポートしたいと思っています。

スプシのデータのフォーマットが時間ではないのは、データの入力規則を利用してプルダウンを作っており、そこで使うデータをQueryする際に「書式なしテキスト」に設定しているからです。

カレンダーにエクスポートするためにはgetHoursを使って時間を取得したいのですが、値の種類が違うからか、実行できません。
GASでスプシの値を取得するときにどのようにして時間に変換すれば良いか、お教えいただきたいです。

使用しているスプレッドシート

該当のソースコード

function onOpen() { var ss = SpreadsheetApp.getActiveSpreadsheet(); //スプレッドシートのメニューにカスタムメニュー「カレンダー連携 > 実行」を作成 var subMenus = []; subMenus.push({ name: "実行", functionName: "createSchedule" //実行で呼び出す関数を指定 }); ss.addMenu("カレンダー連携", subMenus); } /** * 予定を作成する */ function createSchedule() { // 連携するアカウント const gAccount = "〇〇"; // 連携するカレンダーのアドレスを入れる // 読み取り範囲(表の始まり行と終わり列) const topRow = 2; const lastCol = 6; // 0始まりで列を指定しておく const statusCellNum = 0; const dayCellNum = 1; const startCellNum = 3; const endCellNum = 4; const titleCellNum = 5; // シートを取得 var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // 予定の最終行を取得 var lastRow = sheet.getLastRow(); //予定の一覧を取得 var contents = sheet.getRange(topRow, 1, sheet.getLastRow(), lastCol).getValues(); // googleカレンダーの取得 var calender = CalendarApp.getCalendarById(gAccount); //順に予定を作成(今回は正しい値が来ることを想定) for (i = 0; i <= lastRow - topRow; i++) { //「済」っぽいのか、空の場合は飛ばす var status = contents[i][statusCellNum]; if ( status == "済" || status == "済み" || status == "OK" || contents[i][dayCellNum] == "" ) { continue; } // 値をセット 日時はフォーマットして保持 var day = new Date(contents[i][dayCellNum]); var startTime = contents[i][startCellNum]; var endTime = contents[i][endCellNum]; var title = contents[i][titleCellNum]; try { // 開始終了が無ければ終日で設定 if (startTime == '' || endTime == '') { //予定を作成 calender.createAllDayEvent( title, new Date(day), ); // 開始終了時間があれば範囲で設定 } else { // 開始日時をフォーマット var startDate = new Date(day); startDate.setHours(startTime).getHours() startDate.setMinutes(startTime).getMinutes(); // 終了日時をフォーマット var endDate = new Date(day); endDate.setHours(endTime).getHours() endDate.setMinutes(endTime).getMinutes(); // 予定を作成 calender.createEvent( title, startDate, endDate, ); } //無事に予定が作成されたら「済」にする sheet.getRange(topRow + i, 2).setValue("済"); // エラーの場合(今回はログ出力のみ) } catch(e) { Logger.log(e); } } // ブラウザへ完了通知 Browser.msgBox("完了"); }

試したこと

setNumberFormatで変換

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

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

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

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

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

guest

回答3

0

ベストアンサー

javascript

1 2const onOpen = ()=> { 3 const ss = SpreadsheetApp.getActiveSpreadsheet(); 4 //スプレッドシートのメニューにカスタムメニュー「カレンダー連携 > 実行」を作成 5 const subMenus = [{ 6 name: "実行", 7 functionName: "createSchedule" //実行で呼び出す関数を指定 8 }]; 9 ss.addMenu("カレンダー連携", subMenus); 10} 11/** 12 * 予定を作成する 13 */ 14const createSchedule = () => { 15 // 連携するアカウント 16 const gAccount = "〇〇"; // 連携するカレンダーのアドレスを入れる 17 18 // 1 行目は見出し行 "連携 日付 曜日 開始 終了 名前" 19 20 // 0始まりで列を指定しておく 21 const statusCellNum = 0; 22 const dayCellNum = 1; 23 const startCellNum = 3; 24 const endCellNum = 4; 25 const titleCellNum = 5; 26 27 const dropDone = generateFilter(statusCellNum,["済","済み","OK"]); 28 const dropEmptyDate = generateFilter(dayCellNum,[""]); 29 // googleカレンダーの取得 30 const calender = CalendarApp.getCalendarById(gAccount); 31 // シートを取得 32// const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 33 const sheet = SpreadsheetApp.getActive().getSheetByName("マスター"); 34 const data = sheet.getDataRange().getValues(); 35 data.forEach((r,i)=> { 36 if(i===0) return; 37 if(dropDone(r)) return; 38 if(dropEmptyDate(r)) return; 39 const eventDay = r[dayCellNum]; 40 const eventStart = r[startCellNum]; 41 const eventEnd = r[endCellNum]; 42 const eventTitle = r[titleCellNum]; 43 if(eventStart === "" || eventEnd === "") { 44 try { 45 calender.createAllDayEvent(eventTitle, eventDay); 46 sheet.getRange(i + 1, 1).setValue("済"); 47 return; 48 } catch(e) { 49 console.log(e); 50 } 51 } 52 const startTime = eventDay.setHours(eventStart.split(":")[0],eventStart.split(":")[1]); 53 const endTime = eventDay.setHours(eventEnd.split(":")[0],eventEnd.split(":")[1]); 54 try { 55 calender.createEvent(eventTitle, startTime, endTime); 56 sheet.getRange(i + 1, 1).setValue("済"); 57 } catch(e) { 58 console.log(e); 59 } 60 }); 61 // ブラウザへ完了通知 62 Browser.msgBox("完了"); 63} 64const generateFilter = (idx, values) => (e) => e[idx] === undefined || values.includes(e[idx]);

「済」を書き戻す都合上、この体裁の表でしか動かないので、2 行目からはじまるとか、6 列あるとかっていうのは定義しなくていいのではないかと思って削除しました。
時間のパースあたりは、 fj68 様の回答もご参考に。

投稿2021/10/25 12:51

papinianus

総合スコア12705

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

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

0

コード内の// 開始終了時間があれば範囲で設定のブロックの話だとしたら、日時の文字列をあらかじめ作ったうえでDate型にしたほうが早いと思います。

javascript

1 // 開始日時をフォーマット 2 var startDate = new Date(`${day.toDateString()} ${startTime}`); 3 var endDate = new Date(`${day.toDateString()} ${endTime}`);

※動作確認時のログ

javascript

1 var day = new Date("2021/1/1"); 2 var startTime = "11:00"; 3 console.log(day); 4 // Fri Jan 01 2021 00:00:00 GMT+0900 (Japan Standard Time) 5 console.log(new Date(`${day.toDateString()} ${startTime}`)); 6 // Fri Jan 01 2021 11:00:00 GMT+0900 (Japan Standard Time)

投稿2021/10/23 13:57

attakei

総合スコア2738

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

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

0

Date.prototype.setHours()Date.prototype.setMinutes()は時・分・秒などそれぞれの整数値を引数に指定します。
13:00のような文字列だとうまくいかないので、事前にパースするとよいでしょう。
設定するだけならDate.prototype.setHours()で時・分・秒・ミリ秒まで一括で指定できます。

Date.prototype.setHours() - JavaScript | MDN

js

1/* '13:00'→[13, 0]にする関数 */ 2function parseHours(hours) { 3 return hours.split(':').map(v => Number(v)); 4} 5 6/* ...省略... */ 7var startDate = new Date(day); 8startDate.setHours(...parseHours(startTime));

投稿2021/10/23 10:46

fj68

総合スコア752

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問