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

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

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

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

JavaScript

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

3回答

949閲覧

【JavaScript】ループ最初に実行回数は決まっておらず、ループ内にて次のループを実行するかどうかを判定する書き方

Trilin

総合スコア2

Google Apps Script

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

JavaScript

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2022/09/02 17:08

編集2022/09/02 17:10

前提

JavaScriptにてループ処理を行っています。
ループ1回目で実行回数は決まっておらず「各ループによって次のループをするかどうか」という処理を実装したいのですが、実装方法が分からず困っております。

実現したいこと

以下のような処理をループを用いて実装したいです。
必ず1回はAPIリクエストを送信し、2回目以降は「next_cursor」があったら次のループ、なかった時点でループ終了というイメージです。

該当のソースコード

JavaScript

1const userResponse = slackAccessor.requestUserList(); // 実行①(必ず行うリクエスト) 2let userInfo = userResponse.members; 3 4// response.response_metadata.next_cursorがあるまで「requestUserList()」を繰り返す 5if (userResponse.response_metadata.next_cursor) { // 実行①で「next_cursor」がなかったら実行しない 6 let response1 = slackAccessor.requestUserList(userResponse.response_metadata.next_cursor); // 実行②(実行①でnext_cursorがあったら) 7 let members = response1.members; 8 userInfo = userInfo.concat(members) 9 if (response1.response_metadata.next_cursor) { 10 let response2 = slackAccessor.requestUserList(response1.response_metadata.next_cursor); // 実行③(実行②でnext_cursorがあったら) 11 let members = response2.members; 12 userInfo = userInfo.concat(members) 13 if (response2.response_metadata.next_cursor) { 14 let response3 = slackAccessor.requestUserList(response2.response_metadata.next_cursor); // 実行③(実行②でnext_cursorがあったら) 15 let members = response3.members; 16 userInfo = userInfo.concat(members) 17 if (response3.response_metadata.next_cursor) { 18 let response4 = slackAccessor.requestUserList(response3.response_metadata.next_cursor); // 実行④(実行③でnext_cursorがあったら) 19 let members = response4.members; 20 userInfo = userInfo.concat(members) 21 } 22 // 以下「実行⑤」「実行⑥」... とnext_cursorがなくなるまで繰り返す 23 } 24 } 25}

最後に

よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

JavaScript入門書とか読んでなくて、whileforの構文を知らないと言うことなんでしょうか?

userInfo以外の変数は後で使わない前提で。

JavaScript

1let response = slackAccessor.requestUserList(); 2let userInfo = response.members; 3while(response.response_metadata.next_cursor){ 4 response = slackAccessor.requestUserList(response.response_metadata.next_cursor); 5 userInfo = userInfo.concat(response.members); 6} 7あるいは、 8let response = slackAccessor.requestUserList(); 9let userInfo = []; 10do{ 11 userInfo = userInfo.concat(response.members); 12 response = slackAccessor.requestUserList(response.response_metadata.next_cursor); 13}while(response.response_metadata.next_cursor);

夜中なので見間違いがあるかも。

ちゃんと入門しないでプログラムを書くのは却って効率悪いと思いますよ。

投稿2022/09/02 18:03

otn

総合スコア84557

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

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

Trilin

2022/09/03 02:47

回答いただきありがとうございます! whileやforで書いていたのですが上手くいかなかったので、特別な書き方が必要なのかと思い質問させていただきました💦 精進します!
otn

2022/09/03 14:15

> whileやforで書いていたのですが上手くいかなかったので、 そのうまく行かなかったというコードを載せた方が良かったですね。
guest

0

1回目は実行するということならば、

JavaScript

1do { 2 ... 3} while (response.response_metadata.next_cursor);

とか

JavaScript

1while (true) { 2 ... 3 if (!response.response_metadata.next_cursor) break; 4}

といった書き方をします。

投稿2022/09/02 17:56

編集2022/09/02 18:11
shiracamus

総合スコア5406

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

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

Trilin

2022/09/03 02:56

回答いただきありがとうございます! do while, またwhile文の中で条件式を使うなど色々やり方あったのですね、、それぞれ試してみます!
guest

0

ベストアンサー

無限ループになってしまう場合がないか気をつける必要はありますが、何回目かに必ず next_cursor が無い、またはfalsy な値となっているレスポンスが返されることを前提として、基本的には以下でよいかと思います。

javascript

1let userInfo = [], cursor; 2 3while (true) { 4 const response = slackAccessor.requestUserList(cursor); 5 6 userInfo = userInfo.concat(response.members); 7 8 cursor = response.response_metadata.next_cursor; 9 if (!cursor) break; 10}

参考までに、擬似的な slackAccessor を作成して、上記のロジックを試すデモを作成しました。

このデモでは、

  • members はアルファベット一文字の配列です。
  • 1回のrequestUserListごとに3個の要素を含む members がレスポンスに含まれます。
  • 6回目のrequestUserList が返すレスポンスのresponse_metadata には next_cursor が含まれません。
  • 従って7回目のrequestUserList は呼ばれずにループからbreakします。
  • 結果として、userInfo は 3個/回 × 6回= 18個 のアルファベットを含む配列になります。

※実際にこのコードを使うときは、ループの上限回数を超えたら break するなど、レスポンスがどうであっても無限ループにはならないような防御的なコード追加が必要かと思います。

投稿2022/09/02 18:11

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Trilin

2022/09/03 02:55

回答いただきありがとうございます! また、デモの作成まで詳細にしていただきありがとうございます!! > レスポンスがどうであっても無限ループにはならないような防御的なコード追加が必要 cursorが""になるときにループ終了させたいイメージでしたが、レスポンスがどうであれ、、というのは非常に勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問