(license)みなさん、こんにちは!タカハシ(@ntakahashi0505)です。Scriptのクラス」をテーマにシリーズ連載をお送りしてまいりました。前回の記事はこちらです。Scriptのクラス」をテーマにシリーズでお送りしています。今回は、GASでオブジェクトに直接追加しているプロパティのみをループする方法をお伝えします。tonari-it.com2019.02.27GASでオブジェクトに直接追加しているプロパティについてのみループをする方法をお伝えしました。それで、そのプロパティについてのみループしてログ出力するという機能もよく使いそうなので、メソッドとしてクラスに追加しちゃおうと思っています。簡単にはいかないことがありまして...今回はそのへんを進めていきますよ。GASでselfを使ってスコープの中からインスタンスを表すthisを使えるようにする方法です。以下のようなスプレッドシートがあります。この一行ずつのデータを表すクラスを作成しました。こちらのクラスPersonです。Person;})(this);それで、各行から生成したインスタンスを集合で扱うためのクラスを作りました。それがこちらのクラスPersonsです。Persons;})(this);それで、前回。このPersonsクラスのインスタンスから、それに含まれるPersonオブジェクトのデータをログ出力で確認できるように、Object.keysメソッドを使って以下のような処理を作成しました。this」とは?それで、このPersonsオブジェクトの内容をログ出力するメソッドなのですが、よく使いそうなので、Personsクラスに追加しちゃおう!というのが今回やりたいことです。引っかかるポイントがあります。this」であり、それはなぜかということについてお伝えしていきます。「undefinedのメソッドを呼び出せません」では、ひとまずストレートにメソッドを追加してみましょう。上記のmyFunctionの5~9行目を、コンストラクタPersonsのprotorypeプロパティにlogメソッドとして追加していきます。コンストラクタPersonsでいうと、24行目あたりに以下のようなコードを挿入すれば良さそうに思えます。{this[id].log();});}では、myFunctionを以下のように変更して、実行してみましょう。Persons();persons.log();}おや...?ダメですね。「undefinedのメソッド「log」を呼び出せません。」というエラーが出てしまいます。thisは場所によって参照するものが異なるここでいう「this」はPersonsクラスのインスタンスを表していてほしくて、ブラケット(角括弧)の中にidを指定しているので、これでPresonオブジェクトを取り出しているはず...そして、Personオブジェクトにはlogメソッドがあるので、それを呼び出せるはず...と思っていたのですが、ちょっと勝手が違うようです。このエラー、原因を知るのは難しいのですが、forEachメソッドの引数として指定されている関数が原因です。その中に「this」があるのですが、実はこの関数内のthisはPersonsオブジェクトではなく、グローバルオブジェクトを表します。thisの場所と参照先の対応thisは場所によって参照するものが異なるのです。表にすると以下になります。グローバルオブジェクトつまり、コンストラクタ直下もしくはメソッド直下であれば、そのインスタンスを表すわけですが、その内部に含まれる関数の中に入ってしまうと、thisはグローバルオブジェクトになっちゃうというわけです。そもそもグローバルオブジェクトには「a01」とか「a02」といったプロパティが存在していないので、未定義つまりundefinedとなってしまうというわけです。thisがグローバルオブジェクトを指していることを確認では、forEachメソッドの関数内のthisがグローバルオブジェクトを指していることを確認してみましょう。グローバル領域に以下のような、ステートメントを書いておきます。'foo';これで、グローバルオブジェクトのa01やa02はundefinedではなくなります。続いて、コンストラクタPersonsのlogメソッドですが、以下のようにして実行してみましょ。{Logger.log(this[id]);});}確かに、forEachメソッドの関数内のthisはグローバルオブジェクトでしたね。selfを使ってインスタンスを関数内に持ち込むでは、forEachメソッドの関数内でインスタンスを参照したいときはどうすれば良いでしょうか?実はそんなに難しいことではなくて、logメソッド内でインスタンスを指しているときのthisを任意の変数に代入しておいて、関数内からそれを参照すればOKです。その任意の変数として、よくselfという変数名が使われるというわけです。{self[id].log();});}logメソッド内では、thisは呼び出したオブジェクトを指します。Personsオブジェクトのインスタンスです。それを、変数selfに代入しておきます。forEachメソッド内ではthisはグローバルオブジェクトになってしまいますが、変数selfは変わらずPersonsオブジェクトのインスタンスを参照しているというわけです。myFunctionを実行すると、無事にすべてのデータについてログ出力されていることを確認できます。まとめ以上、GASでselfを使って関数の中からインスタンスを表すthisを使えるようにする方法をお伝えしました。スコープとthis...ものすごいJavaScriptの特徴を味わえる内容だったと思います。ハマりやすいポイントだと思いますので、覚えておくとよいですね。次回はいよいよPersonsオブジェクトの内容をスプレッドシートに反映させるメソッドを作ります。Scriptのクラス」ということでシリーズをお送りしております。GASでオブジェクトのデータをスプレッドシートに反映させるメソッドの作り方をお伝えします。Scriptでクラスを作ろう使いどころやそのメリットが分かりづらいGASの「クラス」。本シリーズでは、初心者でもわかるように「これでもか!」とじっくり着実にクラスとそのメリットについて解説をしていきます。プランノーツ代表、コミュニティ「ノンプロ研」主宰。ITで日本の『働く』の価値を上げる!」をテーマに、VBA&GASの開発、講師、執筆などをしております。→詳しいプロフィールはコチラ★ご依頼・ご相談はお気軽にどうぞ!→お問い合わせはコチラ★フォロー頂ければ嬉しいです。「コミュニティ+講座」形式で継続性&教え合える環境も提供。!ノンプログラマーがプログラミングスキルを身に着ける支援ををするコミュニティ。セミナー・もくもく会・Facebookグループのサポートで「自らで学び続ける力をつける」支援、「教え合うことで学びの価値を上げる」場の提供をしています。Script完全入門」が12/23に発売!その内容と見どころを紹介します拙著「詳解!GoogleAppsScript完全入門」の発売が決まりました!「こんなGAS本が欲しかった」という本です。今回は、なぜ本書を書こうと思ったのか、目次や内容、見どころなどについてお知らせします。Cloudとは「JavaScriptで動作するWebページ(動的サイト)を色々な言語でスクレイピング」することをシリーズでお伝えしています。Cloudのアカウント作成についてお伝えします。Scriptのクラス」をテーマにお送りしております。今回は、GASでスプレッドシートのデータの集合を表すクラスを作成する方法をお伝えしていきます。Scriptを使ってスプレッドシートの自作関数を作っています。APIを使って郵便番号から住所を求めるスプレッドシート関数を作ります。API初心者にもおすすめです。ScriptGASのWebページのナビゲーションをBootstrapでスタイルする方法GASユーザーのためのHTML入門ということで、簡単なWebページの作り方をお伝えしています。今回は、GASのWebページのナビゲーション、つまりnavタグ内をBootstrapでスタイルする方法です。Scriptで明日締切のTrelloのカード数をカウントして、チャットワークに通知する方法をお伝えします。チャットワークに通知することでタスク管理をする場合の締切忘れなどを防げます。「コミュニティ+講座」形式で継続性&教え合える環境も提供。詳細・お申込はこちら隣ITを応援する当ブログを「応援したい!」「役に立ったよ!」というお気持ちを、コチラからお支払いただくことができます。日々更新の活力倍増いたします。※PayPalアカウントが必要です。※金額は変更可能です。Platform23HTML・CSS32iPhone・アプリ29Monaca・スマホアプリ開発7PC全般・Windows86PowerPoint・VBA28Python87RPA1VBScript15Vue.js・JavaScript13WEBサービス・クラウド68WordPress・ブログ88Word・VBA42コミュニティ・イベント109セミナーのお知らせ11チャットワーク72データ分析・アクセス解析40仕事・生産性・働き方73動画配信8商業出版21起業・フリーランス72電子書籍・Kindle3運営会社プランノーツは"IT×働き方改革"をお手伝いする会社です。「コミュニティ+講座」形式で継続性&教え合える環境も提供。詳細・お申込はこちら隣ITを応援する当ブログを「応援したい!」「役に立ったよ!」というお気持ちを、コチラからお支払いただくことができます。日々更新の活力倍増いたします。※PayPalアカウントが必要です。※金額は変更可能です。Platform23HTML・CSS32iPhone・アプリ29Monaca・スマホアプリ開発7PC全般・Windows86PowerPoint・VBA28Python87RPA1VBScript15Vue.js・JavaScript13WEBサービス・クラウド68WordPress・ブログ88Word・VBA42コミュニティ・イベント109セミナーのお知らせ11チャットワーク72データ分析・アクセス解析40仕事・生産性・働き方73動画配信8商業出版21起業・フリーランス72電子書籍・Kindle3運営会社プランノーツは"IT×働き方改革"をお手伝いする会社です。Scriptが「V8ランタイム」をサポート!モダンなECMAScript構文が使えるようになった2020.02.072020.02.08GASでコピーしたGoogleスライドのプレゼンテーションを取得する方法2020.02.052020.02.05Facebookページいつも隣にitのお仕事タイトルとURLをコピーしました。