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

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

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

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

Google カレンダー

Google カレンダーは、Google社が提供する無料のスケジュール管理ツールです。パソコンやスマートフォン、タブレットなどからアクセスし、スケジュールの追加・変更が可能。Googleアカウントがあれば誰でも使用できます。

Google Apps Script

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

2回答

1034閲覧

gas スプレッドシートからカレンダー連携について(getHoursが使用できない)

shun2005

総合スコア5

Google スプレッドシート

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

Google カレンダー

Google カレンダーは、Google社が提供する無料のスケジュール管理ツールです。パソコンやスマートフォン、タブレットなどからアクセスし、スケジュールの追加・変更が可能。Googleアカウントがあれば誰でも使用できます。

Google Apps Script

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2020/02/24 03:47

前提・実現したいこと

スプレッドシートでスケジュール管理を行い、その内容をグーグルカレンダーへ連携を行いたいと考えています。
"○"であればカレンダーに挿入し、実施後は"×"を入れる
"×"であればカレンダーに挿入しないとしたいと考えています

|実行するか|ID|タイトル|日付|開始時間|実施時間|住所|説明
|:--|:--:|--:|
|○|1|テスト1|2020/02/19|15:00|1:00|東京都千代田区丸の内1丁目||
|○|2|テスト2|2020/02/20|15:00|1:00|東京都千代田区丸の内1丁目||

コード function createEvents() { var sheet = SpreadsheetApp.getActiveSheet(); var calendar = CalendarApp.getDefaultCalendar(); var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues(); //ステータス判定 var status = SpreadsheetApp.getActiveSheet().getDataRange().getValues();[i][0]; //範囲確認 for(var i = 1; i <= values.length; i++){ //○で会った場合 if(sheet.getRange(i, 1).getValue() === "○"){ var title = '(仮)' + values[i,1] +values[i,2]; var startTime = addTime(new Date(values[i,4]), values[i,4]); var endTime = addTime(new Date(values[i,5]), startTime, values[i,5]); var option = { description: values[i,7], location: values[i,6] } calendar.createEvent(title, startTime, endTime, option); sheet.getRange(i, 1).setValue("×"); } }} function addTime(date, time, howLong){ if(!howLong) { howLong = new Date(0,0,0,0,0,0); } date.setHours(time.getHours() + howLong.getHours()); date.setMinutes(time.getMinutes() + howLong.getMinutes()); return date; }

発生している問題・エラーメッセージ

ネット上の情報から自分なりに行っていますが、getHours()でエラーが出てしまい連携ができません

エラーメッセージ TypeError: undefined のメソッド「getHours」を呼び出せません。(行 51、ファイル「コード」) ### 該当のソースコード ```ここに言語名を入力 ソースコード gas ### 試したこと ここに問題に対して試したことを記載してください。 gerHoursが推奨では無いとのことなので Calendar.get(Calendar.HOUR_OF_DAY)をいう情報が有りましたが、どのように使用したらいいかもわかりません ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

javascript

1function createEvents() { 2 var sheet = SpreadsheetApp.getActiveSheet(); 3 var calendar = CalendarApp.getDefaultCalendar(); 4 var values = sheet.getDataRange().getValues(); 5 //範囲確認 6 for(var i = 0; i <=values.length; i++){ 7 //○ 8 if(sheet.getRange(i+1, 1).getValue() === "○"){ 9 var title = '(仮)' + values[i][1] +values[i][2]; 10 11 var startTime = addTime(new Date(values[i][3]), values[i][4]); 12 var endTime = addTime(new Date(values[i][3]), startTime, values[i][5]); 13 var option = { 14 description: values[i][7], 15 location: values[i][6] 16 } 17 //calendar.createEvent(title, startTime, endTime, option); 18 sheet.getRange(i+1, 1).setValue("×"); 19 } 20 }} 21 22function addTime(date, time, howLong){ 23 24 if(!howLong) { 25 howLong = new Date(0,0,0,0,0,0); 26 } 27 date.setHours(time.getHours() + howLong.getHours()); 28 date.setMinutes(time.getMinutes() + howLong.getMinutes()); 29 return date; 30}

投稿2020/02/24 04:05

編集2020/02/26 15:55
papinianus

総合スコア12705

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

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

papinianus

2020/02/24 11:58

とくに動作確認はしていませんが、回答してしまった手前、実行せずにわかるおかしなところを直しました。
shun2005

2020/02/25 00:16 編集

回答ありがとうございます 実際行いエラー表示はなくなりました しかし、スプレッドシートから行うと、"○"が"×"に変わるのみで、カレンダー連携ができません 知識不足でわからないのですが、functionでわかれているから?なのか教えていただけると幸いです また、addtimeでは実施すると「Cannot read property 'setHours' of undefined(行 44、ファイル「コード」」とでてしまいます
papinianus

2020/02/25 00:45

✕になるということは、正常終了してますね。 デフォルトカレンダーとは違うカレンダーを見ているか、日付がおかしいのだと思います。 開始時間や実施時間のようにスプレッドシートで経過時間の書式にすると18991230の0時からの経過時間となりました。この状態で日付の計算をすると意図した日時が取れません。スプレッドシートの書式に依存するのでこちらからは原因を探れません。
shun2005

2020/02/25 04:56

回答ありがとうございます 正常終了するのですが、やはりカレンダーに連携ができません。 デフォルトカレンダーを使用していると思います 書式依存かと思い、日付と、時間に書式を整えましたが連携されません const gAccount = "★★@gmail.com";などのアカウント指定がないのが原因の場合とかありますか? 他のサイトで使用していたのでもってきました アドバイスいただけるとありがたいです
papinianus

2020/02/26 16:02 編集

カレンダーに連携というのが、イベントの登録であればできてました。1899/12/30 をみてください。何度やってもできます。もちろんA列が○でないと動かないので、2回目以降は手動で○に戻して確認しました。 もしかして、日付列に書いてある 2020/02/19 とかに作りたいのであれば、日付計算時にD列を基礎の日付として採用するように回答を変更しましたのでご参照ください。 バグったコードから何がやりたいかを探すのは困難なので、どの部分が他のサイトなどから持ってきたものなのか、どの部分が質問者様が手を加えたところなのか分かるように、引用サイトの情報を提示してください。 私は質問者さまを信じるタイプの回答者なので val[i][4], val[i][5] と明示的に指定している 4 や 5 が誤りだとは想定しません。i などの変数にのみ誤りがあると思って回答しています。
shun2005

2020/02/27 01:51

回答ありがとうございます 元にしたサイトは https://tonari-it.com/gas-logical-operators/です 条件のifは自分で行っています 日付はおっしゃるとおりの2020/02/19に作成をしたいと考えています もう一つの参考にしたサイトは https://www.whizz-tech.co.jp/3996/です こちらで行うとイベント登録までできました(スプレッドシートをコピーし実施しました)が、 既存の質問に挙げさせていただいているコードでは未だにA列の文字は変わりますが イベントは登録されません 一方ではできているので、スプレッドシートの書式設定は問題ないかと思います 初めてのコードを書くので、正直自分があっているかもわからない状況です
papinianus

2020/02/27 04:53

今現在の、コードで2020年2月に作られませんかね?
shun2005

2020/02/27 05:40

残念ながら今現在のでも作成することができません、、、 ここまでお付き合い頂いたので、なんとか使用したいと思うのですが papinianus様ではイベント登録されているんですよね?
papinianus

2020/02/28 12:42 編集

現在回答にあるコードをスクリプトに貼り付けて、質問にある表をシートにコピペしたら20200219の1500にイベントが作れます。 繰り返しになりますが、○が✕になるということは正常に動作しているということです。2020年2月にないなら、一旦1899年12月30日を見てください。
shun2005

2020/03/03 00:26

返信遅くなり申し訳ありません。 1899年12月30日を確認したところイベントが作成できておりました。 申し訳有りません。 そして、再度添付して頂いたのをコピペしたところ 2020年に登録できました。 ありがとうございます!
guest

0

自己満足回答

javascript

1// 実行メニューから「Chorme V8 を搭載した新しい Apps Script ランタイムを有効にする」を選択してください 2/* 3実行するか ID タイトル 日付 開始時間 実施時間 住所 説明 4○ 1 テスト1 2020/02/19 15:00 1:00 東京都千代田区丸の内1丁目 5○ 2 テスト2 2020/02/20 15:00 1:00 東京都千代田区丸の内1丁目 6*/ 7const q243174 = () => { 8 const sheet = SpreadsheetApp.getActiveSheet(); 9 const calendar = CalendarApp.getDefaultCalendar(); 10 const values = sheet.getDataRange().getValues().map(e=>e[0]!==""?e:registerEvent(calendar,e)); 11 shee.getRange(1,1,values.length,values[0].length).setValues(values); 12} 13const registerEvent = (cal,param)=> { 14 const d = new Date(param[3]); 15 const t = new Date(param[4]); 16 const st = adjustTime(param[3], param[4]); 17 const ed = adjustTime(param[3], param[4], param[5]); 18 const ev = cal.createEvent(`(仮)${param[1]}${param[2]}`,st,ed,{"description":param[7],"location":param[6]}); 19 return [ev.getId(), ...e.slice(1)]; 20} 21const adjustTime = (date,hour,span) => { 22 const d = new Date(date); 23 if(!hour) return d; 24 const t = new Date(hour); 25 const r = new Date(d.getFullYear(),d.getMonth(),d.getDate(),t.getHours(),t.getMinutes(),0); 26 if(!span) return r; 27 const diff = new Date(span) - new Date(1899, 11, 30, 0, 0, 0); 28 const h = diff / 1000 / 60 / 60; 29 const m = (diff / 1000 / 60) % 60; 30 return new Date(r.getFullYear(), r.getMonth(),r.getDate(),r.getHours() + h.r.getMinutes() + m,r.getSeconds()); 31}

投稿2020/02/24 11:54

papinianus

総合スコア12705

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問