🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google Apps Script

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

Q&A

解決済

2回答

1359閲覧

google Apps Scriptを使ってスプレッドシートの予定をカレンダーに登録させたい。

HYoshitaka

総合スコア14

Google Apps Script

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

0グッド

1クリップ

投稿2021/01/27 11:15

編集2021/01/27 14:13

GASを使ってスプレッドシートの内容をカレンダーに登録させたいのですが、下記のようなlogがでます。
startTimeとendTimeを2021/mm/ddに表示させるにはどのようにすればよろしいでしょうか?

gsファイル

function createEvents() { const event = CalendarApp.getCalendarById(',,,,,,,,'); const values = SpreadsheetApp.getActiveSheet().getDataRange().getValues(); values.shift(); for(const record of values){ const title = record[1]; Logger.log(title); let date = new Date(record[2]); Logger.log(date); // let dateString =Utilities.formatDate(new Date(date),'Asia/Tokyo','yyyy/MM/dd HH:mm'); // Logger.log(dateString); // let startDate =new Date(dateString); let startTime = new Date(record[4]); Logger.log(startTime); let endTime = new Date(record[5]); Logger.log(endTime); // const delta = new Date(record[3]); // startTime.setDate(startTime.getDate()); date.setHours(startTime.getHours()); date.setMinutes(startTime.getMinutes()); date.setHours(endTime.getHours()); date.setMinutes(endTime.getMinutes()); Logger.log(startTime); Logger.log(endTime); // const option = { // description: record[4], // location: record[5] // } event.createEvent(title,startTime,endTime); } }

スプレッドシート内容
イメージ説明

logの内容
イメージ説明

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

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

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

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

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

guest

回答2

0

ベストアンサー

タイトル行が邪魔してませんか
イメージ説明

上記のようなテストデータを用意して、以下のコードを動かすとうまくいきました。
shift()では上手くいかず、slice(1)でうまく動きました。二次元配列だからでしょうか。
私も初心者なのでよくわかりません。

function myFunction() { const values = SpreadsheetApp.getActiveSheet().getDataRange().getValues().slice(1); for(const record of values){ const date = record[0]; const time = record[1]; Logger.log(date);  //Thu Jan 28 00:00:00 GMT+09:00 2021 Logger.log(time);        //Sat Dec 30 03:00:00 GMT+09:00 1899 date.setHours(time.getHours()); Logger.log(date); //Thu Jan 28 03:00:00 GMT+09:00 2021 } }

投稿2021/01/28 00:32

編集2021/01/28 00:35
SnowMonkey

総合スコア53

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

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

HYoshitaka

2021/01/28 03:29

ご回答ありがとうございます。 二次元配列の場合はslice()のメソッドを使うんですね。 これからも勉強続けていきたいと思います。
SnowMonkey

2021/01/28 03:44

私も初心者なのでわからないことだらけです。正確なことにお答えできなくて吸いません。 以前タイトル行を処理から除外するときにslice(1)を教えていただきました。 上記のコードのslice(1)をshift()に変えると TypeError: time.getHours is not a functionというエラーメッセージが返ってきます。
sawa

2021/01/28 03:53 編集

shift() は配列そのものに変更を加えるので、 const values = SpreadsheetApp.getActiveSheet().getDataRange().getValues().shift() としてしまうとvalues は1行目のタイトル行だけになります。 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/shift 今回のケースで使うなら質問時の記述のように、 const values = SpreadsheetApp.getActiveSheet().getDataRange().getValues(); valeues.shift() としてあげると console.log(values) でタイトル行を切り捨てた残りの配列となります。 slice(1)は逆に返り値が欲しい1行目を切り捨てた配列なので、1行で書けるこっちを使う人が多いのかなと。
SnowMonkey

2021/01/28 05:17

sawaさん ありがとうございます。勉強になりました。
guest

0

私も初心者です。同じようなものを作りたいと思っていたので反応いたしました。

event.createEvent(title,date,startTime,endTime);

とありますが、引数はこれで正しいでしょうか。

https://google-apps-script.net/instructions/?p=367 によると
createEvent()は以下の使い方をするとありました。

createEvent(title, startTime, endTime) createEvent(title, startTime, endTime, options)

そこでdateが余計な引数かもしれないと推測しました

言い換えると、dateが入ることで、
開始時間が2021/1/27 0:00:00
終了時刻が1899/12/30 15:00:00
オプションが 終了時間のセルの内容になっているのかもしれません

ちなみに同様なコードを載せているサイトを確認すると
https://tonari-it.com/gas-calendar-create-events-spreadsheet/
ではセルの入力の時点で日付+時間で入力してあります。

https://www.whizz-tech.co.jp/3996/#i-5
では、日付と時刻を別々に入力してありますが、
createEventにセットする前に統合しているようです。

投稿2021/01/27 12:02

SnowMonkey

総合スコア53

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

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

HYoshitaka

2021/01/27 13:55

ご回答ありがとうございます。 createEventの使い方に関しては理解できました。 そこで、startTimeとendTimeに2021/mm/ddとさせたいのですが、 上記のようなlogになります。 いろいろ調べてみたのですが解決策が分かりませんでした。
SnowMonkey

2021/01/27 14:28

logをみると私の推測が当たっていたようですね。 https://www.whizz-tech.co.jp/3996/#i-5をご覧ください このサイトのやり方では for 文で一行ずつ処理しながら、 まず、日付、開始時刻、終了時刻などを取得し。 そして、setHourなどをつかって、年月日に時刻、分を加えて整えます 別のやり方として、シートの方で式を使うかなんかして、GASで処理する前に整えておくのも簡単で良いかもしれません。
SnowMonkey

2021/01/27 14:46 編集

当初の質問は「開始時間は終了時間よりも前じゃないといけません」という旨のエラーメッセージが表示されるので、それを何とかしたいということだったと思います。 その疑問は解消したはずですので、いったん質問を閉じて、新たな質問として日付の処理について投稿してはいかがでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問