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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

872閲覧

オブジェクトのkeyとvalueの順番を、任意の順番にしたいです

atago_IT

総合スコア8

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2022/09/06 08:38

前提

GASでGoogleカレンダーに登録された予定をSlackのチャンネルに投稿するシステムを開発しています。
スケジュールを取得する機能を実装中に以下の問題が発生しました。

実現したいこと

オブジェクトschedules(10、35、42、44、46、50、51、56行目)の中身の順番を、
title, startHour, startMinute, endHour, endMinuteの順に整形したいです。

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

オブジェクトschedules(10、35、42、44、46、50、51、56行目)の中身の順番が、
バラバラ且つコードを実行したときによって順番が違う

該当のソースコード

JavaScript

1let calendarIds = { 2 'XXXXXXXX': 'XXXXXXXX', 3 'XXXXXXXX': 'XXXXXXXX', 4 'XXXXXXXX': 'XXXXXXXX' 5}; 6 7// スケジュールを取得 8function getSchedules() { 9 10 let schedules = []; 11 // メンバーのGoogleカレンダーIDを取得 12 let calendarId = Object.keys(calendarIds); 13 calendarId.forEach((calendarId)=>{ 14 15 // メンバーの名前をmemberに代入 16 let member = calendarId; 17 18 // myCalendarに各々のcalendarIdを格納 19 let myCalendar = CalendarApp.getCalendarById(calendarIds[calendarId]); 20 21 // 今日の年月日を取得 22 let today = new Date(); 23 let events = myCalendar.getEventsForDay(today); 24 25 for (let i in events) { 26 let event = events[i]; 27 28 let title = event.getTitle(); 29 30 let startHour = event.getStartTime().getHours(); 31 let startMinute = event.getStartTime().getMinutes(); 32 let endHour = event.getEndTime().getHours(); 33 let endMinute = event.getEndTime().getMinutes(); 34 35 return schedules = { 36 title: title, 37 startHour: startHour, 38 startMinute: startMinute, 39 endHour: endHour, 40 endMinute: endMinute 41 }; 42 return schedules; 43 }; 44 return schedules; 45 }); 46 return schedules; 47}; 48 49function notifySlack() { 50 let schedules = getSchedules(); 51 Logger.log(schedules); 52 53 let text = '本日の予定は以下になります。'; 54 Logger.log(text); 55 56 Object.keys(schedules).forEach(key => { 57 Logger.log(text += '・'+schedules[key]+'\n'); 58 }) 59 60 let payload = { 61 'username': 'お知らせ', 62 'text': text, 63 'channel': '#general' 64 }; 65 66 let options = { 67 'method': 'post', 68 'contentType': 'application/JSON', 69 'payload': JSON.stringify(payload) 70 }; 71 72 const URL = 'https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXX'; 73 UrlFetchApp.fetch(URL, options); 74};

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

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

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

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

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

guest

回答2

0

ベストアンサー

title, startHour, startMinute, endHour, endMinuteの順に整形したいです。

Object.keysを使わずに、この5つを入れた配列を作ってループを回すのがいちばん確実です。

仕様上は、Object.keysがどんな順番で返すかは複雑な仕様になっているのと、GASをV8に切り替えていない場合は仕様なしの古いECMAに沿っての実行となります。。

投稿2022/09/06 09:05

maisumakun

総合スコア145184

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

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

atago_IT

2022/09/08 09:09

for...of を使って配列をループ処理したら、順番に整形できました。 ありがとうございました!
guest

0

new Map

javascript

1return schedules = { 2 title: title, 3 startHour: startHour, 4 startMinute: startMinute, 5 endHour: endHour, 6 endMinute: endMinute 7};

「オブジェクトのプロパティ」はiterableではありません。

key,value形式で指定した順番で列挙する動作を期待する場合は、new Map が妥当だと思います。

javascript

1'use strict'; 2const schedule = new Map([ 3 ['title', 'lunch'], 4 ['startHour', 12], 5 ['startMinute', 0], 6 ['endHour', 13], 7 ['endMinute', 0] 8]); 9 10for (let [key, value] of schedule) console.log(key + ': ' + value);

Symbol.iterator

Symbol.iterator を使用することで、iterableなオブジェクトを生成することができます。

javascript

1'use strict'; 2class Schedule { 3 constructor (title, startHour, startMinute, endHour, endMinute) { 4 this.title = title; 5 this.startHour = startHour; 6 this.startMinute = startMinute; 7 this.endHour = endHour; 8 this.endMinute = endMinute; 9 } 10 [Symbol.iterator] = function* () { 11 for (let key of ['title', 'startHour', 'startMinute', 'endHour', 'endMinute']) { 12 yield [key, this[key]]; 13 } 14 } 15} 16 17for (let [key, value] of new Schedule('lunch', 12, 0, 13, 0)) console.log(key + ': ' + value);

Re: atago_IT さん

投稿2022/09/06 10:27

編集2022/09/06 10:52
think49

総合スコア18162

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

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

atago_IT

2022/09/08 09:09

ご回答ありがとうございました。 お手数をお掛けしました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問