Quantcast
Channel: いつも隣にITのお仕事
Viewing all 2095 articles
Browse latest View live

Google Apps Scriptでクラスに最も簡単なプロパティを追加する方法

$
0
0
instant

photo credit: La Chachalaca Fotografía Sunflower + Instant Sunflower via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

「初心者でもわかるGoogle Apps Scriptのクラス」をテーマにシリーズでお伝えしております。

前回の記事はこちら。

初心者でもできるGoogle Apps Scriptで最も簡単なクラスを作る方法
今回は、初心者でもできるGoogle Apps Scriptで最も簡単なクラスを作る方法です。new演算子、インスタンス、コンストラクタという難しそうなワードも超丁寧に解説していきますよ。

GASで最も簡単なクラスの作り方をお伝えしました。

ただ、ちょっと簡単すぎて「空っぽのオブジェクト」を作るクラスだったんですよね…

ということで、今回はGoogle Apps Scriptでクラスに最も簡単なプロパティを追加する方法です。

プロパティを追加して、「空っぽじゃないオブジェクト」を生成するクラスを作ります。

あと、thisキーワードの意味についてもお伝えしますよ。

では、行ってみましょう!

前回のおさらい

まずは、前回のおさらいです。

作成したスクリプトはこちらでした。

function myFunction() {
  
  var Person = function(){};
  var p = new Person();
  Logger.log(p);
  
}

まず、Personがコンストラクタになりますね。

コンストラクタは、new演算子で生成されたインスタンスにあれこれ定義するために呼び出される関数です。

GASでが、このコンストラクタがクラスの正体でしたね。

ただ、コンストラクタには何の処理も定義されていませんでしたので、生成されたインスタンスも空っぽのオブジェクトでした。

今回は、コンストラクタにプロパティを定義していこうということです。

クラスにプロパティを追加する

クラスから生成されたインスタンスはオブジェクトですから、プロパティとメソッドを持つことができるはずです。

まずは、生成したインスタンスにプロパティを持たせるようにしてみましょう。

例えば、クラスPersonから、nameという1つのプロパティを持つオブジェクトを生成したいとします。

こんなときコンストラクタPersonにはどのような処理を追加したら良いかというと、以下のようになります。

function myFunction() {
  
  var Person = function(){
    this.name = "Bob";
  };

  var p = new Person();
  Logger.log(p);
 
}

では、実行してログを確認してみましょう!

生成したインスタンスにnameプロパティを追加

ちゃんとインスタンスにnameプロパティが追加されていることを確認できますね。

thisキーワードとは

「this」という見慣れないものが登場しましたね…

これはthisキーワードと呼ばれるもので、コンストラクタ内で使った場合は生成されたインスタンス自体を表すキーワードとなります。

ですから、コンストラクタ内で以下のように記述することで、そのプロパティを定義することができます。

this.プロパティ = 値

(このthisキーワードですが、「どこで使うか」によって、その表すものが変わってきますので注意が必要です。コンストラクタ以外で使用する場合については、別の役割を持ちますのでシリーズを通して紹介していきますね。)

インスタンス生成時にプロパティをセットする

では、以下のようなスクリプトを作って実行してみましょう。

クラスPersonからインスタンスを2回作ってみようというものです。

function myFunction() {
  
  var Person = function(){
    this.name = "Bob";
  };

  var p = new Person();
  Logger.log(p);
  
  var q = new Person();
  Logger.log(q);
 
}

ログを確認してみると…

生成されたインスタンスのnameプロパティの値が同じ

生成した2つのインスタンスについて、そのnameプロパティが両方とも「Bob」になっちゃいますね。

まあ、当たり前と言えば当たり前ですが。

別のインスタンスであれば、そのプロパティに別の値を格納したいですよね…

生成してからプロパティをいちいち上書きするのもバカバカしいですし。

いったい、どうすればよいでしょうか?

コンストラクタに引数を渡す

さて、前回の記事で紹介した、new演算子を使ってコンストラクタを呼び出す書式を思い出してください。

こちらです。

var 変数 = new 関数名(引数1, 引数2,…)

ほら、関数(=コンストラクタ)を呼び出すときに、渡せるんですよ、引数が。

ですから、先ほどのスクリプトも、コンストラクタの呼び出し時に、それぞれ別の引数を渡します。

そして、コンストラクタではその受け取った値を、プロパティに代入する形にしてあげれば良いんですね。

function myFunction() {
  
  var Person = function(name){
    this.name = name;
  };

  var p = new Person("Bob");
  Logger.log(p);
  
  var q = new Person("Tom");
  Logger.log(q);
 
}

実行してログを確認すると…

インスタンスに別々のプロパティの値を設定

ばっちり!

インスタンス生成時にプロパティに別々の値を渡すことができましたね。

まとめ

以上、Google Apps Scriptでクラスに最も簡単なプロパティを追加する方法をお伝えしました。

今回は何と言ってもthisキーワードがポイントですね。

コンストラクタ内で使用する場合は、生成したインスタンス自体を表す便利なキーワードです。

ちょっと不思議な気もしますが、とっても重要なので、今後ともよろしくお願いします。

次回は、クラスにメソッドを追加していきます。

どうぞお楽しみに!

連載目次:初心者向けGoogle Apps Scriptでクラスを作ろう

使いどころやそのメリットが分かりづらいGASの「クラス」。本シリーズでは、初心者でもわかるように「これでもか!」とじっくり着実にクラスとそのメリットについて解説をしていきます。
  1. 【初心者向け】Google Apps Scriptでクラスを理解するためのオブジェクトの基礎知識
  2. 初心者でもできるGoogle Apps Scriptで最も簡単なクラスを作る方法
  3. Google Apps Scriptでクラスに最も簡単なプロパティを追加する方法

スプレッドシートのQUERY関数を使う最初の一歩!クエリを理解する

$
0
0

QUERY関数アイキャッチ1

みなさんこんにちは!
もり(@moripro3)です!

GoogleスプレッドシートQUERY関数の使い方をシリーズでお届けしていきます!

シリーズ初回の当記事では、「最初の一歩」としてこれらをお伝えします。

  • スプレッドシートのQUERY関数とは
  • QUERY関数の最大の肝「クエリ」とは何か?
  • QUERY関数を使用するメリット

QUERY関数は、Excelにはない、Googleスプレッドシート特有の便利な関数です。
それではシリーズを通して習得していきましょう!

QUERY関数とは

QUERY関数とは、「データ」に「条件」を指定して、目的のデータを抽出する関数です。

構文がこちらです。Google公式ドキュメントも参考にご覧ください。

QUERY(データ, クエリ, [見出し])

3つの引数を指定します。

引数 省略の可否 説明
データ 必須 クエリを実行するセルの範囲
クエリ 必須 データ操作を実行する条件
見出し 省略可 データの上部にある見出し行の数

このQUERY関数を使うために重要な「クエリ」とは何か、詳しくみていきます。

クエリとは

英単語「query」の意味がこちらです。

  • 質問する
  • 問い合わせする

IT用語としての「クエリ」の意味もみてみましょう。

データベース管理システムに対する問合せ(処理要求)のこと。

データの抽出や更新などの処理要求を文字列で表す。処理対象のテーブルやデータの抽出条件、並べ方などを指定する。(ITトレンドより引用)

このシリーズを通じて、「クエリ=問合せ」と理解しておきましょう。

クエリのイメージを理解する

この項では、「データ」に「クエリ」を実行して目的のデータを抽出するイメージをつかみましょう。

会社の社員一覧から、特定の社員情報を抽出します。この場合、「社員の一覧」が「データ」にあたります。

query1-1

 

スプレッドシートに「データ」を作成します。これがデータベースの役割をします。

query1-4

この「データ」(データベース)に対して「クエリ」を実行します。

単一条件を指定するクエリ

すべての社員からタカハシさんを抽出する「クエリ」を作ってみます。「クエリ」とは「問合せ」ですね。

query1-2

 

このクエリを実行すると、条件に合致する3人の「タカハシ」さんがやって来ます。これが、クエリの実行結果です。

query1-3

 

この処理を、スプレッドシートのQUERY関数で表現してみます。

A~D列の「データ」に対して、QUERY関数で「クエリ」を実行して結果を取得しています。

※QUERY関数の「引数の指定方法」はシリーズを通して詳しく紹介していきますので、ここではイメージだけ確認しましょう。

query1-5

単一条件の指定と並び替えをするクエリ

クエリは「データの並び替え」もできます。下記の例だと、2つの「問合せ」をまとめて実行しています。

①タカハシさんを呼ぶ
②社員番号順に並んでもらう

query1-6

スプレッドシートで実行した結果です。タカハシさんが社員番号順に並びます。

query1-10

複数条件を指定するクエリ

クエリは「複数の条件」を指定することも可能です。

・部署=システム部
・姓=タカハシ

を抽出するイメージがこちらです。

query1-7

スプレッドシートでのクエリの実行結果がこちらです。(※QUERY関数の使い方はシリーズを通して解説していきますのでご安心を!)

query1-11

 

以上が、QUERY関数で「クエリ」を実行するイメージです。QUERY関数を使用すると、大量の「データ」から、目的のデータのみを抽出することができます。

QUERY関数を使用するメリット

QUERY関数は、「データ」に「クエリ」を実行して、目的のデータを抽出する関数とイメージしてもらえたかと思います。

ここで気になるのが、「なぜ、QUERY関数を使う必要があるのか?」です。

スプレッドシートには「フィルタ」や「並び替え」機能がありますよね。

フィルタ機能を使えば、目的の行を取得することができます。社員番号で並び替えるなら「並び替え」の機能も使えます。

query1-8

一度だけデータを抽出する」「一度だけデータの並び替えをする」のであれば、これらの機能でも十分かもしれません。

元データの変更内容を自動で取得できる

日次でシステムからデータを取得して、スプレッドシートに貼り付け、決まった条件でデータを抽出する作業を考えてみます。

「フィルタ」や「並び替え」の機能だと、元データが変わったら、そのたびに手動で条件を設定する必要がありますよね。

QUERY関数は、一度セルに関数を入力すれば、元データに変更が発生した場合も、自動で結果が反映されます。

さきほどのスプレッドシートの元データを2点変更してみます。

①姓をタカハシ→マツイに変更
②新入社員タカハシさんを追加

F1セルに入力されているQUERY関数はそのままですが、取得結果が自動で反映されました。

query1-9

元データが変わるたびに、手作業でポチポチと条件を設定するのはめんどうくさいですよね。毎日こんな風に呼び出す作業と同じです。

query1-12

それに対して、QUERY関数は「貼り紙」のようなものです。一度条件を設定すれば、人が何もしなくても、自動で最新データを取得できます。
複雑な条件でも、セルに関数を入力しておくだけでよいのが便利です。

query1-13

QUERY関数は、「いつも同じ条件でデータを抽出するルーチン作業で、最高に役立つ関数」と覚えておきましょう!

「元データ」と「抽出データ」を別シートで管理できる

QUERY関数を使うと、「元データ」と「抽出データ(結果)」を別シートに分けることも可能です。

①別々のスプレッドシートに分ける

  • 元データ = スプレッドシートAのシート1
  • 抽出データ = スプレッドシートBのシート1

②同一スプレッドシートの別シートに分ける

  • 元データ = スプレッドシートAのシート1
  • 抽出データ = スプレッドシートAのシート2

「元データ」をシート1に用意して、

query1-14

シート2にQUERY関数を入力してデータを取得することも可能です。(シート1を参照する)

query1-15

 

このように、「元データ」と「抽出データ」を分けることで、データの管理がしやすくなります。
スプレッドシートを開いたら、前の作業者がフィルタをかけっぱなしだった!なんてイライラもなくなりますね。

「SQL」を習得できる

QUERY関数の「クエリ」は、データベース言語の1つである「SQL」がベースになっています。

仕事で大量のデータ集計をする方は、「SQL」を習得すると、AccessやExcelVBAでも利用できます。

【エクセルVBA&Access連携】SQL文でデータを抽出する最も簡単なプログラム
エクセルVBAでAccessデータベースを操作する方法についてシリーズでお伝えしています。今回はデータベース言語SQLとADODB.Recordsetオブジェクトでデータベースからデータを抽出します。

SQLってプログラマが使うものでしょ…と思っている事務職の方も、ぜひチャレンジしてみてください。

まとめ

今回の記事では、QUERY関数を紹介するシリーズの第一歩として、この3点をお伝えしました。

  • スプレッドシートのQUERY関数とは?
  • 「クエリ」とは何か?
  • QUERY関数を使うメリット
    • 一度セルに関数を入力すれば、元データに変更が発生した場合も、自動で結果が反映される
    • 「元データ」と「抽出データ」を分けて管理できる

ルーチン作業で、いつも同じ条件を指定してデータを抽出している人は、ぜひ覚えておきたい関数です!

次回は、QUERY関数の基本的な使い方・引数の指定方法をお伝えします。

どうぞお楽しみに!

Google Apps Scriptでクラスに最も簡単なメソッドを追加する方法

$
0
0
prototype

photo credit: over 14 MILLION views Thanks SIA-7B prototype Italian plane 1917 NARA111-SC-14309-ac via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

「初心者でもわかるGoogle Apps Scriptのクラスを作ろう!」のシリーズをお送りしています。

前回の記事はこちらです。

Google Apps Scriptでクラスに最も簡単なプロパティを追加する方法
「初心者でもわかるGoogle Apps Scriptのクラス」をテーマにシリーズでお伝えしております。今回はGASのクラスに最も簡単なプロパティを追加する方法です。thisキーワードの意味も解説します。

GASのクラスにプロパティを追加する方法をお伝えしました。

プロパティが追加できたので、今度はメソッドですね。

ということで、今回はGoogle Apps Scriptでクラスに最も簡単なメソッドを追加する方法です。

では、行ってみましょう!

前回のおさらい

では、前回のおさらいからです。

function myFunction() {
  
  var Person = function(name){
    this.name = name;
  };

  var p = new Person("Bob");
  Logger.log(p);
  
  var q = new Person("Tom");
  Logger.log(q);
 
}

クラスPersonに、nameプロパティを追加しました。そして、コンストラクタが呼び出されたときに受け取る引数を、nameプロパティに格納するようにしています。

コンストラクタ内で使用されているthisキーワードは、生成されたインスタンス自身を表すんでしたね。

今回は、メソッドを追加していきますよ!

クラスにメソッドを追加する

さて、クラスPersonにメソッドを追加していきます。

で、ちょっと以下の記事を見て思い出してほしいのですが、オブジェクトのプロパティには関数を格納することもできました。

そして、その場合は、プロパティとは言わずにメソッドというんでしたね。

【初心者向け】Google Apps Scriptでクラスを理解するためのオブジェクトの基礎知識
「初心者でもわかるGoogle Apps Scriptのクラス」をテーマに、その使い方と便利さについてお伝えしていきます。今回は、GASでクラスを理解するためのオブジェクトの基礎知識についてお伝えしていきます。

ということは、メソッドを追加するには、コンストラクタ内にインスタンスのプロパティへ関数を代入する処理を追加すればいいんです。

クラスにメソッドを追加したスクリプト

以下のスクリプトのように、greetメソッドを追加しました。

function myFunction() {
  
  var Person = function(name){
    this.name = name;
    this.greet = function(){
      Browser.msgBox(this.name + "です、こんにちは!");
    };
  };

  var p = new Person("Bob");
  Logger.log(p);
  p.greet();
  
  var q = new Person("Tom");
  Logger.log(q);
  q.greet();
 
}

コンストラクタPersonの中に、greetプロパティに、メッセージダイアログを表示する関数を格納します。

その場合、greetメソッドになるわけですね。

そして、メッセージとして表示する内容に、インスタンス自身thisのnameプロパティを使っています。

では、実行してみましょう。

クラスに追加したメソッドで表示したダイアログ

この図は「Bob」のgreetメソッドですが、「OK」をクリックすれば、続いて「Tom」のgreetメソッドも実行されますよ。

そして出力されたログがこちらです。

生成されたインスタンスの出力したログ

インスタンスpとインスタンスqそれぞれにメソッドが追加されていることが確認できますね。

prototypeプロパティにメソッドを追加する

それぞれにメソッドが追加…

つまり、図にするとこういう状態ですね。

それぞれのインスタンスにメソッドを追加

なんか、ちょっともったいなくありません?

プロパティの値はインスタンスが異なったら別の値が入ると予想されますから、別に気になりませんが、メソッドの内容は同じなのに、インスタンスが生成されればされるだけコピーされちゃいます。

メモリがもったいない!

どこか一箇所にメソッドを定義しておいて、それをすべてのインスタンスで使いまわしちゃいたい!

そんな願いを叶えるのが、プロトタイプという仕組みです。

プロトタイプとは

GASのすべてのクラスは、prototypeプロパティという特別なプロパティを持ちます。

デフォルトでは空のオブジェクトとなっていますが、そこにメンバーを追加することができます。

メソッドを追加するなら、以下のような書式になります。

クラス名.prototype.メソッド = function()(仮引数1, 仮引数2,…){
 //処理
}

インスタンスについてメソッドが呼び出された際、インスタンス内にそのメソッドが見当たらないときには、prototypeプロパティの内部を参照して呼び出すことができるという仕組みです。

図にすると、以下のようになりますね。

プロトタイプの仕組み

GASでは、コンストラクタで個別のインスタンスにメソッドを追加することをせずに、prototypeプロパティに追加するのが一般的ですね。

プロトタイプにメソッドを追加したスクリプト

では、先ほどのスクリプトについて、クラスPersonのprototypeプロパティにメソッドを追加するように修正してみましょう。

function myFunction() {
  
  var Person = function(name){
    this.name = name;
  };
  
  Person.prototype.greet = function(){
    Browser.msgBox(this.name + "です、こんにちは!");
  };

  var p = new Person("Bob");
  Logger.log(p);
  p.greet();
  
  var q = new Person("Tom");
  Logger.log(q);
  q.greet();
 
}

実行すると、先ほどと同様にメソッドが呼び出せていることを確認できるはずです。

まとめ

以上、Google Apps Scriptでクラスに最も簡単なメソッドを追加する方法をお伝えしました。

プロトタイプという仕組みprototypeプロパティを使ったメソッドの追加の方法をぜひマスターくださいね。

では、次回からスプレッドシートのデータをクラス化していきたいと思います。

どうぞお楽しみに!

連載目次:初心者向けGoogle Apps Scriptでクラスを作ろう

使いどころやそのメリットが分かりづらいGASの「クラス」。本シリーズでは、初心者でもわかるように「これでもか!」とじっくり着実にクラスとそのメリットについて解説をしていきます。
  1. 【初心者向け】Google Apps Scriptでクラスを理解するためのオブジェクトの基礎知識
  2. 初心者でもできるGoogle Apps Scriptで最も簡単なクラスを作る方法
  3. Google Apps Scriptでクラスに最も簡単なプロパティを追加する方法
  4. Google Apps Scriptでクラスに最も簡単なメソッドを追加する方法

Windowsのポチポチ業務を爆速化するPowerShell、短いワードでサッと関数を呼び出すエイリアスの使い方

$
0
0

みなさんこんにちは、テラド(@terashin1226)です!

Windowsのポチポチ業務(マウスを使った業務)を爆速化するために、PowerShellを使った効率化の方法をお伝えしています。

前回はコンソールから関数を登録して呼び出す方法をお伝えしました。

Windowsのポチポチ業務を爆速化するPowerShell、関数をコンソールで登録して呼び出す方法
Windowsのポチポチ業務(=マウスを使った業務)を爆速化するPowerShell。関数をコンソールから登録して呼び出す方法をお伝えします!

社内データは西暦で管理されているけど、提出用の書類は和暦で書かないといけない…」

日常の業務で割とありませんか?

西暦和暦変換表をサイトで開いて「ええと1986年は…和暦で…何年だ?」こんな面倒な作業はコンピュータにサクッとやってもらいましょう!

今回からPowerShellをコンソール上からサクッと西暦を和暦に変換する方法をお伝えしていきます!

  • 関数を短い名前で呼び出せるエイリアスについて
  • 関数とエイリアスをいつでも呼び出し可能にするプロファイルについて
  • 西暦を和暦へ変換する関数を作成する
  • 完成した関数とそのエイリアスをプロファイルに登録する

というように順を追って説明していきますよ!

本記事では関数を短い名前で呼び出せるエイリアスをご紹介します。関数名とは別に「あだ名」をつけて呼び出すようなイメージです。

それではいってみましょう!

エイリアスとは

コンソールでよく使うコマンドレットや関数の長い名前を毎回タイプするのは面倒くさいですよね。

そこで便利なのがエイリアスという方法です。

エイリアスとは「あだ名」のように、関数を短い名前で呼び出す方法のことです。

よく名前を呼ぶのに、毎回フルネームだと大変ですよね…

エイリアスを使えば、友達を呼ぶように短いあだ名で呼びだせるようになります。

New-Aliasでエイリアスを作成する

エイリアスを作成するにはNew-Aliasコマンドレットを使用します。構文は以下の通りです。

New-Alias -Name “エイリアス” コマンドレット名

対象としたコマンドレットまたは自作の関数にエイリアス=あだ名をつけることができます。

試しにコンソールの表示をクリアするコマンドレット:Clear-Hostにエイリアスを設定してみます。

New-Alias -Name "ch" Clear-Host

コンソールで実行すると…

何も起こらずに処理が終了しました。

Get-Aliasでエイリアスを確認する

現在設定されているエイリアスを確認するには、コマンドレット:Get-Aliasを使用します。

コンソールで実行すると…

このように設定されているエイリアスすべてが表示されます。

さきほど設定したchが登録されていますね!

…あれ!そのchの少し下にもClear-Hostのエイリアス「clear」が設定されていますね。

このようにデフォルトで設定されているエイリアスもあるので、エイリアスを設定する前には一度Get-Aliasでデフォルトのエイリアスを確認しておくとよいでしょう。

では、実際に設定したエイリアス「ch」を使ってみましょう!

実行すると…

このようにコンソールに入力されていた内容がすべてクリアされました!

「ch」というエイリアスで「Clear-Host」が呼び出されていることがわかりました。

関数にエイリアスを設定する

エイリアスの仕組みがわかったところで、自作の関数にエイリアスを設定する方法を見ていきましょう。

構文はコマンドレットの場合と同じです。

New-Alias -Name “エイリアス” 関数名

引数で入力した文字と「Hello! 」という文字を結合してコンソールに出力する簡単な関数を用意します。

スクリプトは上から順に解釈され実行されるので、関数の定義の下にNew-Aliasを追加してください。

function Hello-World($str){
    Write-Host ("Hello! " + $str)
}

New-Alias -Name "hw" Hello-World

ISEで入力して「sample.ps1」という名称でスクリプトを保存します。ISEで実行すると…

何も起こらずに処理が終了しました。

Get-Aliasで確認すると…

関数Hello-Worldにエイリアス「hw」が設定されていますね!

エイリアス「hw」を使って、関数を呼び出してみましょう。引数には「エイリアス」という文字列を設定します。

hw "エイリアス"

コンソールで入力して実行すると…

エイリアス「hw」で自作の関数「Hello-World」を呼び出すことができました。

「関数名を短くすればいいのでは…」というご意見もあるかもしれませんが、他のスクリプトから呼び出す場合を考えると短い名称では何をやっているか一目でわからない=可読性が悪くなるので、「動詞-名詞」とわかりやすい関数名をつけておいて、コンソールでよく使う場合はエイリアスを設定したほうがよいでしょう!

まとめ

いかがだったでしょうか。

New-Aliasコマンドレットを使えば、短い名前で関数やコマンドレットを呼び出せるエイリアスを設定できます

しかし、エイリアスはPowerShellを終了すると消えてしまいます。

次回はPowerShellを起動時に実行されるプロファイルというスクリプトについてご紹介します。プロファイルを使えば、PowerShellの起動時に自動で関数やエイリアスを登録してくれます。

では、最後までお読みいただきありがとうございました!

連載目次:Windowsのポチポチ業務を爆速化するPowerShell

Windowsのポチポチ業務(マウスを使った業務)を爆速化するために、PowerShellを使った効率化の方法をお伝えしています。
  1. Windowsのポチポチ業務を爆速化するPowerShell、はじめのハードルぐーーんと下げてみます!
  2. Windowsのポチポチ業務を爆速化するPowerShell、キーボードを使わずササっと起動する方法
  3. Windowsのポチポチ操作を爆速化するPowerShellの絶対条件!ディレクトリとその移動をマスターしよう!
  4. Windowsのポチポチ業務を爆速化するPowerShell、コマンドレットを腹の底から理解する!
  5. Windowsのポチポチ業務を爆速化するPowerShell、オンラインヘルプでコマンドレットを使い倒す!
  6. Windowsのポチポチ業務を爆速化するPowerShell、統合開発環境ISEを紹介します!
  7. Windowsのポチポチ業務を爆速化するPowerShell、スクリプトを実行するための準備
  8. Windowsのポチポチ業務を爆速化するPowerShell、フォルダを作るスクリプトの作り方
  9. Windowsのポチポチ業務を爆速化するPowerShell、if文を使いフォルダの有無で処理を分岐させる方法
  10. Windowsのポチポチ業務を爆速化するPowerShell、ForEach-Objectで配列の全要素を処理する方法
  11. Windowsのポチポチ業務を爆速化するPowerShell、パイプラインを使いコマンドレット間で値を引き渡す方法
  12. Windowsのポチポチ業務を爆速化するPowerShell、ファイルを別フォルダにコピーし名称を変更する方法
  13. Windowsのポチポチ業務を爆速化するPowerShell、ファイル名を変更する方法
  14. Windowsのポチポチ業務を爆速化するPowerShell、正規表現で複雑なファイル名変更をする方法
  15. Windowsのポチポチ業務を爆速化するPowerShell、タスクスケジューラでスクリプトを決まった日時に起動する方法
  16. Windowsのポチポチ業務を爆速化するPowerShell、ファイルをバックアップするスクリプトの作り方
  17. Windowsのポチポチ業務を爆速化するPowerShell、関数を作ってスクリプトから呼び出す方法
  18. Windowsのポチポチ業務を爆速化するPowerShell、関数をコンソールで登録して呼び出す方法

Google Apps Scriptでスプレッドシートのデータの1行分を表すクラスを作る方法

$
0
0
record

photo credit: Jonas Hellebuyck Vinyl memories via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

「初心者でもわかるGoogle Apps Scriptのクラスの作り方」をテーマにシリーズをお送りしています。

前回の記事はこちら。

Google Apps Scriptでクラスに最も簡単なメソッドを追加する方法
「初心者でもわかるGoogle Apps Scriptのクラスを作ろう!」のシリーズをお送りしています。今回はGASでクラスに最も簡単なメソッドを追加する方法です。プロトタイプについても解説していますよ。

GASのクラスにメソッドを追加する方法についてお伝えしました。

今回は、当初目標にしていたスプレッドシートのデータのクラス化を進めていきたいと思いますよ。

Google Apps Scriptでスプレッドシートのデータの1行分を表すクラスを作る方法です。

では、行ってみましょう!

前回のおさらい

まずは前回のおさらいからです。

作成したスクリプトはこちらでした。

function myFunction() {
  
  var Person = function(name){
    this.name = name;
  };
  
  Person.prototype.greet = function(){
    Browser.msgBox(this.name + "です、こんにちは!");
  };

  var p = new Person("Bob");
  Logger.log(p);
  p.greet();
  
  var q = new Person("Tom");
  Logger.log(q);
  q.greet();
 
}

nameプロパティと、greetメソッドを持つクラスPersonを作成しましたね。

スプレッドシートの一行分を表すクラスを作る

さて、以下のようなスプレッドシートのデータがあります。

スプレッドシートのテーブル

前述のクラスPersonを拡張して、これらのデータの一行分を表すクラスを作成していきたいというのが今回のお題となります。

見出しごとにプロパティを作る

スプレッドシートの表の見出しとして、id、name、gender、birthdayとありますので、これをそのままプロパティ名として流用すれば良さそうですよね。

例えば、こんな感じでしょうか。

var Person = function(id, name, gender, birthday){
  this.id = id;
  this.name = name;
  this.gender   = gender;
  this.birthday = birthday;
};

すると、インスタンスの生成は…

var p = Person('a01', 'Bob', 'male', new('1993/1/1'));

うん、めんどい。

バラバラではなくて、まとめてコンストラクタにデータを渡したいですよね。

コンストラクタに一行分の配列を渡す

GASの場合は、スプレッドシートのデータをいい感じに二次元配列に取得することができます。

【初心者向けGAS】スプレッドシートのセル範囲の値を二次元配列として取得して取り扱う方法
Google Apps Script初心者向けのお題として、名言Botの作り方をお伝えしています。今回は、スプレッドシートのセル範囲の値を二次元配列としてgetValuesで取得して取り扱う方法です。

この二次元配列から、要素である一次元配列を取り出すと、それが行のデータの集合となっているわけです。

なので、コンストラクタを以下のように、行のデータの集合である配列recordを受け取るようにしてみましょう。

var Person = function(record){
  this.id = record[0];
  this.name = record[1];
  this.gender   = record[2];
  this.birthday = record[3];
};

すると、インスタンスの生成は

var p = Person(values[1]);

などと書けます。

スッキリしてて良い感じです。

たまたま、スプレッドシートのデータの列が増えても、コンストラクタさえ変更すれば、インスタンスの生成はそのままでいきそうですしね。

スプレッドシートの一行分のデータをクラス化するスクリプト

では、上記をもとにまとめと動作確認をするスクリプトです。

こちらです。

function myFunction() {  
  
  var Person = function(record){
    this.id = record[0];
    this.name = record[1];
    this.gender = record[2];
    this.birthday = record[3];
  };
  
  Person.prototype.greet = function(){
    Browser.msgBox(this.name + "です、こんにちは!");
  };
  
  Person.prototype.log = function(){
    Logger.log('%s|%s|%s|%s|', this.id, this.name, this.gender, this.birthday);
  };

  var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
  var p = new Person(values[1]);
  p.log();
  p.greet();
  
  var q = new Person(values[2]);
  q.log()
  q.greet();
   
}

Personのインスタンスが持つデータを確認するためのlogメソッドも作ってみました。

実行すると、BobさんとTomさんの分について、以下のようにメッセージダイアログが表示されつつ

クラスのメソッドによるメッセージダイアログ

以下のように、インスタンスが持つデータのログを確認することができます。

インスタンスが持つデータのログを確認する

まとめ

以上、Google Apps Scriptでスプレッドシートのデータの1行分を表すクラスを作る方法をお伝えしました。

GASではスプレッドシートのデータが二次元配列で取得できますので、その要素である一次元配列としてコンストラクタに渡してあげる形にすれば良いですね。

次回は、プロパティをプライベートにする方法についてお伝えしていきます。

どうぞお楽しみに!

連載目次:初心者向けGoogle Apps Scriptでクラスを作ろう

使いどころやそのメリットが分かりづらいGASの「クラス」。本シリーズでは、初心者でもわかるように「これでもか!」とじっくり着実にクラスとそのメリットについて解説をしていきます。
  1. 【初心者向け】Google Apps Scriptでクラスを理解するためのオブジェクトの基礎知識
  2. 初心者でもできるGoogle Apps Scriptで最も簡単なクラスを作る方法
  3. Google Apps Scriptでクラスに最も簡単なプロパティを追加する方法
  4. Google Apps Scriptでクラスに最も簡単なメソッドを追加する方法

【エクセルVBA】255文字を超えたらどうなるの?入力規則のリスト設定方法あれこれ

$
0
0
vba,validation,255

皆様こんにちは、ノグチです。

エクセルの入力規則は、使いこなせばとても便利な機能ですよね。

職場で使うエクセルツールで使用されることも多いのではないでしょうか。

中でもリストで作成するドロップダウンリストは、ツール使用者に入力させる文字列を限定でき、かつ使用者に文字列をキータイピングで入力させる必要がないので入力が楽、キータイピングが不要=入力間違いがないという点で、結構使い勝手が良いものです。

以前下記の記事で、この入力規則のドロップダウンリストをVBAで作成したり、ドロップダウンリストに表示するテキストの更新方法を紹介しました。

【エクセルVBA】Validation.Addメソッドで入力規則のドロップダウンを作る方法
ValidationオブジェクトのAddメソッドを使って、セルに入力規則のドロップダウンリストを作成する方法をご紹介しています。シートやブックに入力された値によって入力規則の種類を変えたり、ドロップダウンリストに表示する値を変えたい、という時に便利に使えますよ。

この記事の中で、さらっと「設定できる文字列の長さは255文字までですよ!」と言っているのですが、実際にこの文字制限を超えた場合、一体どうなるのか?までは触れていませんでした。

今回の記事では、実際に255文字を超えたらどうなるのか?、試してみましょう。

入力規則のリストで255文字を超えるとどうなるのか?

手動で文字列を指定した場合

まずは、手動で255文字以上の文字列をにセットする場合を試してみます。

入力規則の条件の設定で「リスト」を選択して、「元の値」に適当に文字を入力していくと…

validation,list,manual

aaa,bbb,cccc,dddd…と入力していったところで、キーボード入力を受け付けなくなってしまいました。

どうやら手動でドロップダウンリストの文字列を入力する場合、255文字以上は入力できないようです。

手動で入力する場合は、そもそも255文字以上入力することができないので、255文字以上の文字列を入力してしまったらどうなるか?という心配は不要ですね。

セル指定の場合

お次は、255文字以上の文字列が入力されたセルを、「元の値」にセットした場合です。

エクセルシートのB3セルに、A列のリストを「,」でつなげて255文字以上にした文字列を作成しました。

念のため、B3セルの文字数を、C3セルのLEN関数でカウントしてあります。

文字数は270文字です。

validation,list,cell

このB2セルを、入力規則の「元の値」にセットしてみると…

validation.list,cell,dropdown

ちゃんとセットできますね。

ドロップダウンリストから文字列を選択しても、問題なさそうです。

ただしこの方法だと、セル内の文字列がドロップダウンリストの1行に全てセットされてしまいます。

この方法なら255文字の制限を気にしなくてもよさそうですが、そもそも、1行しか表示できないならドロップダウンリストにする意味が無いですね。

VBAで指定した場合

では、VBAを使って「元の値」を更新する場合はどうなるか?を試してみましょう。

セットする文字列が入力されているセルを指定する場合

こちらのコードで、C5セルに入力規則のリストを作成して、B3セルの文字列を「元の値」に指定してみます。

Sub Create_Validation_List()
Dim strTxt As String

strTxt = ActiveSheet.Cells(3, 2).Value

With ActiveSheet.Range("C5").Validation
    .Delete
    .Add Type:=xlValidateList, _
    AlertStyle:=xlValidAlertStop, _
    Formula1:=strTxt
End With

End Sub

このコードを実行してみると…

validation,list,実行時エラー,vba

出ました。

実行時エラー”1004″。

エラーだけ見ると関係なさそうに見えますが、リストに指定した文字列が255文字を超えているとこのエラーになるようです。

VBA内でドロップダウンリストにセットする文字列を作成する場合

ちなみに、上のコード内でドロップダウンリストに指定する文字列を、以下のようにVBA内で作っても、同じ実行時エラーになってしまいます。

Sub Create_Validation_List()
Dim strTxt As Variant
Dim i As Long

With ActiveSheet
    
    i = 1
    
    Do Until .Cells(i, 1).Value = ""
        If strTxt = "" Then
            strTxt = .Cells(i, 1).Value
        Else
            strTxt = strTxt & "," & .Cells(i, 1).Value
        End If
        
        i = i + 1
    Loop

    With .Range("C5").Validation
        .Delete
        .Add Type:=xlValidateList, _
        AlertStyle:=xlValidAlertStop, _
        Formula1:=strTxt
        .InCellDropdown = True
    End With
End With

相変わらずのエラーの分かりにくさですが、VBAでも文字列を直接「元の値」にセットする場合、255文字を超えていると受け付けられないようですね。

OFFSET関数で指定した場合

ならばOFFSET関数を使った場合はどうでしょう。validation,list,offset

A列のリストを、OFFSET関数で指定してみると…

validation,list,offset,dropdown,sheet

 

ちゃんとドロップダウンリストにA列の文字列達が表示されます。

この方法も、255文字の制限は気にしなくてOKですね。

セル範囲を指定する場合

では、上のシートのA列を、セル範囲でセットしてみるとどうでしょうか。

validation,list,range

A列1~21行目の文字列の合計が255文字以上になるように、リストを作ってみました。

validation,range,dropdown

このリストのセル範囲を、入力規則の「元の値」に指定すると…

validation,list,range.dropdown

エラーなく、ドロップダウンリストにA列の文字列をセットできていますね。

名前付き範囲を指定する場合

エクセルにはセルの範囲に任意の名前を付けて使用することができる、名前付き範囲という機能がありますね。

この名前付き範囲を使ってみます。

validation,list,255

シートのA2セルからA21セルまでの範囲に「文字列テスト」という名前を付けて…

validation,list,名前付き範囲,セット

入力規則の「元の値」に名前付き範囲に指定した名称をセットすると…

validation,list,名前付き範囲

この通り、ドロップダウンリストにA列の文字列がセットされていますね。

A列の文字数のトータルが255文字を超えていても問題なしです。

結果まとめ

色々な方法で入力規則のドロップダウンリストを作って検証してみましたが、結果、「元の値」に指定する文字列が255文字に収まっていればOKなようです。

なので255文字の制限を意識するのは、

  • ドロップダウンリストに表示したい文字列を、入力規則作成画面の「元の値」に手動で入力する場合
  • VBAでドロップダウンリストに表示する文字列を作成して設定する場合
  • VBAでドロップダウンリストに表示する文字列を、既存セル指定によって設定する場合

の3パターンのようですね。

  • セル範囲を指定する
  • 名前付き範囲を指定する
  • OFFSET関数を指定する

の場合は、文字数制限は気にしなくてよさそうです。

この中で最も簡単なのはOFFSET関数を使う方法でしょうか。

しかし、エクセル内で関数を多用するとエクセルの動作が遅くなることがありますので、要注意です。

個人的には、VBAで入力規則の更新をするなら、コードの分り易さも考えて、名前付き範囲を利用するのが良いと思っています。

名前付き範囲を指定する方法なら、文字列のリスト範囲が変わっても名前付き範囲を更新すればよいですし、名前付き範囲は多用してもエクセルの動作に関数ほどは影響を与えませんからね。

最後に

今回は、入力規則のドロップダウンリストの「元の値」に255文字以上を指定するとどうなるか?を色々な方法で検証してみました。

色々な指定の仕方がありますが、エクセルツールの内容や使い方によって、ドロップダウンリストを指定する方法を変えてみるとよいですね。

それでは、最後までお読みいただきありがとうございました!

「YouTube×エクセル」で発信し続ける理由と成し遂げていることについて聴きました

$
0
0
library

photo credit: Thomas Hawk No Good via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

SNS、ブログはもちろん、最近ではYouTubeをはじめとする動画プラットフォームも民主化が進んで誰もが発信する土壌ができてきました。

ノンプログラマーにとっても発信というのは、学習効果はもちろん、発信することで様々な可能性を生み出すことができる重要な技術になりつつあります。

ということで、コミュニティ「ノンプログラマーのためのスキルアップ研究会」定例会Vol.15「ノンプログラマーのためのブログ&動画発信術!」でございます。

今回はスペシャルゲストとして、チャンネル登録者数28000人を超えるYouTubeチャンネル「おさとエクセル」を運営されている長内孝平さん(@osatoexcel)をお呼びして、ご登壇いただきました。

しかも、たいへん忙しい中、青森からお越しいただきまして…ありがとうございます!

当日のツイートまとめは以下になりますので、合わせてお楽しみくださいませ!

ノンプロ研定例会Vol.15「ノンプログラマーのためのブログ&動画発信術!」
ノンプログラマーがスキルを磨いたり、達成したいことを成し遂げたりするのに実はオススメできるのが、ブログや動画などによる「発信」。 今回は、「おさとエクセル」でお馴染みの教育系YouTuberの長内..

YouTubeで残業を減らす!

早速、今回のスペシャルゲストの長内孝平さんのプレゼンについてレポートをしていきます。

「おさとエクセル」がどうやって生まれたのか、どのようにチャンネル登録者数を獲得してきたのか、そして何を成し遂げつつあるのか!?

YouTubeにあまり詳しくないノンプログラマーにも、とてもわかりやすく、かつ非常にためになるお話でした。

「おさとエクセル」の長内孝平さんとは?

長内孝平さんは、エクセルの使い方をはじめ教育系動画を配信するYouTubeチャンネル「ユースフルおさとエクセル」を運営されています。

おさとエクセル
Excelの使い方が学べる、おさとエクセルは「YouTubeで働き方を変える」ことを通じて「いい世の中をつくる個人を増やすこと」に貢献します。2019年までに90本のExcel動画をアップロードし、1,500,000回を超える視聴再生が行われました。コンテンツ高評価割合も90%以上を獲得しチャンネル登録者も27,...

そのチャンネル登録者数は、なんと28000人以上…!

ちなみに、いつも隣にITのお仕事は1000人弱…その圧倒的な数はよーくわかります。

現在28歳、昨年の夏まで商社にお勤めになられていらっしゃいましたが、ユースフル株式会社を立ち上げ、独立。

今は「おさとエクセル」をはじめ教育系動画に全力を注いでいらっしゃいます。

なぜ「YouTube×エクセル」なのか

大学時代に経営学を専攻されていた長内さん。

Excelを使う必要がありましたが、使い方を、ご自身調べる必要がありました。

私なんかですと、普通にググったり、書籍を買ったりとなるんですが、長内さんの時代ではそれが「YouTube」だったんですね…!

美しいジェネレーションギャップです。

ですが、当時のYouTube。

エンタメコンテンツは豊富にありましたが、「エクセル 使い方」でヒットするコンテンツが全然見つからなかったそうです。

かねがね「社会に役立ちたい」と願っていた長内さんが、「YouTubeでエクセルの使い方を教える」という、そのポジションを見つけられた瞬間です。

動画とテキストのコンテンツミックスの可能性

長内さんは、つい先日の2/1に書籍「できるYouTuber式 Excel 現場の教科書」を出版されました。

YouTubeと書籍と連動させながら、エクセルの使い方を解説するという新しいタイプのコンテンツです。

長内さんは「コンテンツミックス」と呼ばれていました。

しかも、書籍の構成を全部考えられた後に、連動する40本の動画をすべて新規に撮り下ろされたとのこと…まじすごい…!

動画は、生産するのは大変、消費するのも大変、ただし「流れ」や「キャラクター」など提供できる情報の種類が豊富という特長があります。

対してテキストは、生産は比較的カンタン、消費するのもカンタン。

全然別物の媒体なので、リーチできるユーザーも違うというもの。

多分、冒頭でお伝えした通り、世代も違いますしね。

実際、書籍を出版されてから急激に「おさとエクセル」のチャンネル登録者数も増えたそうです。

これからトライする人に向けて

たくさんのアドバイスをいただいたのですが、自分的に刺さったのを紹介します。

「求められていることをやろう」

裏を返すと「やりたいことじゃなくていい」「好きなことじゃなくていい」ということです。

社会の役に立ちたいという志のあるビジネスマンが時間に追われてなかなか踏み出せない…そんな現実を見て、だったら「YouTubeで残業を減らそうよ」と、それが実際に受け入れられているということです。

これは、私自身も強い実感ありますね。

なぜかというと、20代のときに音楽(しかもサックスというマイナー楽器)で失敗しているからですね。

好きなことを全力でやれていたとしても、お客さんが数人しかいなかったら、意味ないですし、続けられないですし、凹みます。

逆に、好きなことでなかったとしても、たくさんそれを求める方がいて、貢献できて、たまに感謝していただけるなら、それはとても幸せを感じることなんだと思うんですよね。

そして、困っている人は、世の中にたくさんいますから、すぐに見つけられます。

そのような道を見出して、20代の若さでそのポジションに登りつめた長内さん。

本当に素晴らしい才能ですし、たくさんの学びをいただきました。ありがとうございます!

そして、40歳を超えたオジサンとしては、そういう方がたくさん増えて、まっすぐ元気よく進めるように、邪魔だけはしないようにしていきたいとつくづく思います。

まとめ

以上、「YouTube×エクセル」で発信し続ける長内さんのセッションについてのレポートをお送りしました。

さて、実は隣ITのYouTubeチャンネルも、ブログの記事の動画版を作るという、同じスタイルで一部のコンテンツを提供するものでしたが…いやぁ、なかなかパワーかかるんで、悩みますね。

いつも隣にITのお仕事
ITを活用して日本の「働く」の価値を高めるブログ、「いつも隣にITのお仕事」のYouTubeチャンネルです。 プログラミングやITのテクニックや、コミュニティ「ノンプログラマーのためのスキルアップ研究会」セミナーの動画などを提供していきます。

今はブログとコミュニティ(あと書籍ですかね)という「コンテンツミックス」を仕込んでいて手応えはあるので、短期的にはまずはそれらに注力していきます。

動画については、やはり可能性は強く感じているので、横目でちゃんと流れを見ておかないとですね。

(あ、ちなみに私のブログについてのセッションもあったのですが、自分ではレポートし辛いので、どなたかにお譲りします。)

「ノンプログラマーのためのスキルアップ研究会」定例会・分科会レポート

コミュニティ「ノンプログラマーのためのスキルアップ研究会」では、毎月1回、学びの質やモチベーションを高めるための定例会を開催していますので、こちらで過去のレポートをお送りしています。
教えることは二度学ぶこと!ノンプロ研定例会の参加レポートまとめました!
ノンプログラマーがVBA・GAS・Pythonなどのプログラミングを学ぶコミュニティ「ノンプログラマーのためのスキルアップ研究会」が絶賛活動中です!本ページはノンプロ研定例会の参加レポートまとめです。

Google Apps Scriptのクラスでプライベートプロパティを作成する方法

$
0
0

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

「初心者でもわかるGoogle Apps Scriptでクラスを作ろう!」をシリーズでお送りしております。

前回の記事はこちらです。

Google Apps Scriptでスプレッドシートのデータの1行分を表すクラスを作る方法
「初心者でもわかるGoogle Apps Scriptのクラスの作り方」をテーマにシリーズをお送りしています。今回は、GASでスプレッドシートのデータの1行分を表すクラスを作る方法です。

スプレッドシートの表の一行分を表すクラスを作成しました。

ただ、このクラスをもとに生成したインスタンス、すべてのプロパティが外部から読み書き自由です。

特にid…そう簡単に上書きされたら困りますよね。

ということで、今回はプロパティを上書きできないようにしていきます。

では、Google Apps Scriptのクラスでプライベートプロパティを作成する方法です。

では、行ってみましょう!

前回のおさらい

まず、対象としているスプレッドシートはこんな感じのものです。

スプレッドシートのテーブル

このスプレッドシートの各行のデータを表すクラスを作成しました。

こちらです。

function myFunction() {  
  
  var Person = function(record){
    this.id = record[0];
    this.name = record[1];
    this.gender = record[2];
    this.birthday = record[3];
  };
  
  Person.prototype.greet = function(){
    Browser.msgBox(this.name + "です、こんにちは!");
  };
  
  Person.prototype.log = function(){
    Logger.log('%s|%s|%s|%s|', this.id, this.name, this.gender, this.birthday);
  };

  var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
  var p = new Person(values[1]);
  p.log();
  p.greet();
  
  var q = new Person(values[2]);
  q.log()
  q.greet();
   
}

各列のデータをそれぞれid,name,gender,birthdayというプロパティで表して、かつ挨拶をするgreetメソッド、全部のデータをログ出力するlogメソッドを追加しました。

ただ、冒頭でもお話したとおり、idプロパティ…できれば上書きできないようにしたいですよね(実際、名前も性別も誕生日もですがw)。

ということで、今回はidを表すデータについて外部から上書きできないようにしていきます。

プライベートメンバーを定義する

idを表すデータについて外部から上書きできないようにする…要件を整理すると、以下のようなかたちです。

  • インスタンス内にいわゆるプロパティ以外の方法でデータを保持をする
  • そしてそのidのデータは外部からアクセスできない

これを実現する方法として、JavaScriptではプライベートメンバーという方法が用意されています。

プライベートメンバーの構文

なんか難しそうな名前ですが、コンストラクタ内でvarキーワードを使った変数や関数を普通に宣言するというものです。

プライベートプロパティであれば

var 変数名

プライベートメソッドであれば

var メソッド名 = function(引数1, 引数2,…) {
 //処理
}

とします。

プライベートプロパティを作るスクリプト

今回はプライベートプロパティをつくりたいので、以下のようにしてみました。

function myFunction() {  
  
  var Person = function(record){
    var _id = record[0];
    this.name = record[1];
    this.gender = record[2];
    this.birthday = record[3];
  };
    
  var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
  var p = new Person(values[1]);

  Logger.log(p);
  Logger.log(p._id);
}

ちなみに、変数名をアンダースコア(_)からはじめているのは、慣例的に使用されている「プライベートのしるし」です。

実行すると、以下のようなログが確認できます。

プライベートプロパティへのアクセス

変数_idにはアクセスできませんね。

プライベートメンバーの仕組み

プライベートメンバーの仕組みですが、何も特別なことをしているわけではなく、スコープを利用しているだけです。

コンストラクタは関数ですから、その中の変数は外部からは参照することができません。

一方で、new演算子で呼び出されてインスタンス化されていますので、そのインスタンスが存在している間、その内部の変数は保持されているのです。

まとめ

Google Apps Scriptのクラスでプライベートプロパティを作成する方法をお伝えしました。

スコープの仕組みさえ頭に入っていれば、まあ普通のことですね。

ただ…このままでは上書きもできませんが、読み取りもできないですよね…

ということで、次回は読み取りをするためのゲッターを作っていきます。

どうぞお楽しみに!

連載目次:初心者向けGoogle Apps Scriptでクラスを作ろう

使いどころやそのメリットが分かりづらいGASの「クラス」。本シリーズでは、初心者でもわかるように「これでもか!」とじっくり着実にクラスとそのメリットについて解説をしていきます。
  1. 【初心者向け】Google Apps Scriptでクラスを理解するためのオブジェクトの基礎知識
  2. 初心者でもできるGoogle Apps Scriptで最も簡単なクラスを作る方法
  3. Google Apps Scriptでクラスに最も簡単なプロパティを追加する方法
  4. Google Apps Scriptでクラスに最も簡単なメソッドを追加する方法
  5. Google Apps Scriptでスプレッドシートのデータの1行分を表すクラスを作る方法

QUERY関数の基本!別シートのデータからselect句で列を取得する方法

$
0
0

QUERY関数2アイキャッチ-3

みなさんこんにちは!
もり(@moripro3)です

GoogleスプレッドシートQUERY関数の使い方をシリーズでお届けしています!

前回は「QUERY関数の最初の一歩」として、クエリとは何か?QUERY関数を使うメリットは?をお伝えしました。

スプレッドシートのQUERY関数を使う最初の一歩!クエリを理解する
GoogleスプレッドシートのQUERY関数を紹介するシリーズ。第一回目は、「クエリ」とは何か?クエリでデータを抽出するイメージ・QUERY関数を使うメリットをお伝えします。

今回の記事では、QUERY関数の基本の使い方を紹介します。

  • QUERY関数の3つの引数を理解する
  • 別シートのデータを参照する方法
  • select句で列を抽出する方法

それではみていきましょう!

前回のおさらい:QUERY関数とは

QUERY関数とは「データ」に「クエリ」を指定して、目的のデータを抽出する関数です。クエリとは問合せのことでしたね。

そして、QUERY関数を使用する2大メリットがこちらです。

  • 一度セルに関数を入力すれば、元データに変更が発生した場合も、自動で結果が反映される
  • 元データと抽出データ(結果)を別シートに分けることが可能

QUERY関数の構文が下記で、3つの引数を指定します。(公式ドキュメントはこちら

QUERY(データ, クエリ, [見出し])

QUERY関数の3つの引数を理解しよう

この項では、QUERY関数の3つの引数を詳しくみていきます。

引数 省略の可否 説明
データ 必須 クエリを実行するセルの範囲
クエリ 必須 データ操作を実行する条件
見出し 省略可 データの上部にある見出し行の数

前回、社員一覧(A~D列)からタカハシさんを抽出したQUERY関数がこちらでした。

query2-1

 

F1セルに入力されているQUERY関数の中身です。①~③の3つの引数を指定します。

query2-2

第1引数:データ

クエリを実行するセルの範囲を指定します。

  • 列全体を指定する場合→A:D
  • セル番地で指定する場合→A1:D9

列に値が増えていく想定だと、「列全体」の指定がオススメです。

また、同一スプレッドシート内の別シートを指定する、IMPORTRANGE関数を使用して別のスプレッドシートを指定することも可能です。

IMPORTRANGE関数は、こちらの「他のスプレッドシートの範囲を参照する」の項をご覧ください。

スプレッドシートで別ファイルのデータをVLOOKUPで取得する方法
GoogleスプレッドシートではIMPORTRANGE関数を使って別の異なるスプレッドシートからVLOOKUPでデータを引っ張ってくることができますので、その方法についてお伝えしていきます

第2引数:クエリ

クエリとは「問合せ」のことです。どのような「条件」でデータ抽出するかを指定します。

query1-2

クエリは、二重引用符(ダブルクォート)で囲む必要があります。

where C = ‘タカハシ’

または、セルへの参照も可能です。

クエリ言語をより深く学びたい方は、こちらのドキュメント(英語版)もご覧ください。

第3引数:見出し

データの上部にある見出し行の数を指定します。省略、または、 -1 と指定した場合は、データの内容に基づいて推測されます。

つまり、意図しない結果が返ることもあるので、省略せずに指定しておいたほうがよいでしょう。上記の例だと、A:D列の1行目が見出しなので「1」を指定してます。

別シートのデータを参照する方法

課題一覧表のサンプル使用して紹介していきます。(シート名:課題一覧表)

query2-3

QUERY関数を使うメリットの1つに「元データと抽出データ(結果)を別シートに分けて管理できる」がありましたね。

QUERY関数で別シートを参照する場合の、第1引数の指定方法がこちらです。

    ‘シート名’!セル範囲

    セル範囲の前に ‘シート名’! を付けます(シート名をシングルクォートで囲って、!を付与)

    課題一覧表のA列~E列を参照する場合は、‘課題一覧表’!A:E と記述します。

    それでは次の項で、課題一覧表シートから列の抽出をしてみましょう!

    select句で任意の列を抽出する

    select句とは、データから列を抽出するクエリです。「抽出する列」と「順序」を指定できます。

    まずは、基本の3パターンの書き方を覚えましょう!

    1. 1列のみを抽出する
    2. 複数列を抽出する
    3. すべての列を抽出する

    1列のみを抽出する

    元データから、特定の1列のみを抽出する書き方です。

    selectの後にスプレッドシートの「列」を記述します(列はアルファベットで指定)

    select 列

    課題一覧表シートのA列を新規シートに抽出してみます。第2引数のクエリをダブルクオートで囲むのをお忘れなく!

    query2-13

    複数の列を抽出する

    元データから複数の列を抽出する書き方です。列名をカンマ区切りで指定します。

    select 列,列,列…

    課題一覧表シートのA列・C列・D列を新規シートに抽出してみます。

    =query('課題一覧表'!A:E,"select A,C,D",1)

    query2-14

    列の抽出順序は、アルファベット順とは限らず、入れ替えることも可能です。
    A列、D列、C列の順番で抽出(表示)させてみます。期限とステータスの列を入れ替えて取得できました。

    query2-15

    列数が多い(横に長い)データの必要列のみを印刷するときに、「列の非表示」で不要な列を隠している方、いませんか?こんな風に。

    query2-16

    元データをいじると、全データを見たいときに再度列を表示させなければならず、手間がかかりますよね。あとから元データを見る人も、(ん…?この非表示列、何だろう?)って気になっちゃいますからね。

    QUERY関数のselect句を活用すれば、元データを一切いじることなく、新規シートに必要な列のみを抽出できます!しかも、列の並び順も自由に指定可能です!

    列数の多いデータの管理に苦戦している方は、ぜひ使ってみてくださいね!

    すべての列を抽出する

    最後に、元データのすべての列を抽出する書き方です。

    selectのあとに、アスタリスク(*)を付けます。アスタリスクは「すべて」の意味です。

    select *

    課題一覧表シートのすべての列を新規シートに抽出してみます。

    query2-12

    今の段階では、すべての列を抽出すると、元データをそっくりそのまま取得しただけになります。何の意味があるの?と思いますよね。

    シリーズを通して紹介する他の句と組み合わせる時に役立ちます。この記事では、「アスタリスクですべての列を取得できる」と覚えておきましょう!

    まとめ

    今回の記事では、この3点を紹介しました。

    • QUERY関数の3つの引数
    • 別シートの元データを参照する方法
    • select句で列を抽出する方法、順序を指定する方法
      • select 列(1列を抽出)
      • select 列,列,列…(複数列を抽出)
      • select *(すべての列を抽出)

    次回は、where句を使用して、任意の行を抽出する方法をお伝えします!

    どうぞお楽しみに!

    連載目次:GoogleスプレッドシートQUERY関数をマスターしよう

    スプレッドシートのQUERY関数を使って、データ抽出・集計を効率化する方法を紹介しています。

    1. スプレッドシートのQUERY関数を使う最初の一歩!クエリを理解する

    Google Apps Scriptでプライベートプロパティを取得するメソッドを作成する方法

    $
    0
    0
    crane

    photo credit: gsx-r750 Why? Because they could! via photopin (license)

    みなさん、こんにちは!
    タカハシ(@ntakahashi0505)です。

    初心者でもわかるGoogle Apps Scriptでクラスを作るシリーズです。

    前回の記事はこちら。

    Google Apps Scriptのクラスでプライベートプロパティを作成する方法
    「初心者でもわかるGoogle Apps Scriptでクラスを作ろう!」をシリーズでお送りしております。今回は、Google Apps Scriptのクラスでプライベートプロパティを作成する方法です。

    GASのクラスにプライベートプロパティを作成する方法をお伝えしました。

    今回は、そのプライベートプロパティの値を取得できるメソッドを作っていきます。

    ということで、Google Apps Scriptでプライベートプロパティを取得するメソッドを作成する方法です。

    では、行ってみましょう!

    前回のおさらい

    まず、以下のようなスプレッドシートがあります。

    スプレッドシートのテーブル

    前回までで、この表の各行を表すクラスを作成しました。

    それがこちらです。

    function myFunction() {  
      
      var Person = function(record){
        var _id = record[0];
        this.name = record[1];
        this.gender = record[2];
        this.birthday = record[3];
      };
        
      var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
      var p = new Person(values[1]);
    
      Logger.log(p);
      Logger.log(p._id);
    }

    コンストラクタPerson内で宣言している変数_idがプライベートプロパティでした。

    プライベートなので、実行しても14行目のログは「undefined」。アクセスはできません。

    プライベートプロパティの値を取得するには?

    今回は、このPersonクラスのプライベートプロパティ変数_idの値を取得する方法を考えたいのですが、どうすれば良いでしょうか?

    普通に変数_idを参照することはできませんので、メソッドを経由して取得する方法を模索していくことにしましょう。

    prototypeプロパティにメソッドを追加する

    「メソッド」を作りたいわけですから、以下の記事でお伝えしたとおり、Personクラスのprototypeプロパティを使いたいとなります。

    Google Apps Scriptでクラスに最も簡単なメソッドを追加する方法
    「初心者でもわかるGoogle Apps Scriptのクラスを作ろう!」のシリーズをお送りしています。今回はGASでクラスに最も簡単なメソッドを追加する方法です。プロトタイプについても解説していますよ。

    変数_idの値を返す、getIdというメソッドを追加してみましょう。

    function myFunction() {  
      
      var Person = function(record){
        var _id = record[0];
        this.name = record[1];
        this.gender = record[2];
        this.birthday = record[3];
      };
      
      Person.prototype.getId = function(){
        return _id;
      }
    
      var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
      var p = new Person(values[1]);
      Logger.log(p);
      Logger.log(p.getId());
    }

    しかし、実行すると以下のように 『「_id」が定義されていません。』というエラーになってしまいます。

    変数にアクセスできないエラー
    そうなんです、変数_idをプライベートにしているものはそのスコープ

    コンストラクタ関数内で定義されていることで、その関数内でのみアクセス可能になるから、だからこそのプライベートなんです。

    コンストラクタ関数の外にあるステートメントからはアクセスはできないのです。

    コンストラクタ内にメソッドを定義する

    したがいまして、今回はprototypeプロパティへのメソッド追加は断念。

    コンストラクタ内に、普通にメソッドを定義することにします。

    こちらです。

    function myFunction() {  
      
      var Person = function(record){
        var _id = record[0];
        this.name = record[1];
        this.gender = record[2];
        this.birthday = record[3];
    
        this.getId = function(){
          return _id;  
        };
      };
      
      var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
      var p = new Person(values[1]);
      Logger.log(p);
      Logger.log(p.getId());
    }

    実行結果はこちらです。

    プライベートプロパティの値をログ出力

    このように、プライベートプロパティの値を取得することができました。

    prototypeの利点がなくなってしまいますが、プライベートプロパティにアクセスするには仕方なし、ですかね。

    まとめ

    以上、Google Apps Scriptでプライベートプロパティを取得するメソッドを作成する方法をお伝えしました。

    プライベートプロパティを取得するメソッドは、スコープの関係でクラスのprototypeプロパティには定義できないので、コンストラクタ内に直接定義する必要があります。

    次回は、プライベートプロパティにアクセスする別の方法を紹介していきます。

    どうぞお楽しみに!

    連載目次:初心者向けGoogle Apps Scriptでクラスを作ろう

    使いどころやそのメリットが分かりづらいGASの「クラス」。本シリーズでは、初心者でもわかるように「これでもか!」とじっくり着実にクラスとそのメリットについて解説をしていきます。
    1. 【初心者向け】Google Apps Scriptでクラスを理解するためのオブジェクトの基礎知識
    2. 初心者でもできるGoogle Apps Scriptで最も簡単なクラスを作る方法
    3. Google Apps Scriptでクラスに最も簡単なプロパティを追加する方法
    4. Google Apps Scriptでクラスに最も簡単なメソッドを追加する方法
    5. Google Apps Scriptでスプレッドシートのデータの1行分を表すクラスを作る方法
    6. Google Apps Scriptのクラスでプライベートプロパティを作成する方法

    Windowsのポチポチ業務を爆速化するPowerShell、起動時に関数を自動登録するプロファイルの使い方

    $
    0
    0

    みなさんこんにちは、テラド(@terashin1226)です!

    PowerShellで西暦を和暦にサクッと変換する方法をお伝えしています。

    前回は、関数をあだ名のように短いワードで呼び出すエイリアスについてお伝えしました。

    Windowsのポチポチ業務を爆速化するPowerShell、短いワードでサッと関数を呼び出すエイリアスの使い方
    Windowsのポチポチ業務(=マウスを使った業務)を爆速化するPowerShell。自作した関数をFunctionドライブというものに登録して、いつでも呼び出せるようにする方法をお伝えします!

    今回はPowerShellを起動したときに自動で実行されるプロファイルというスクリプトを使って、関数やエイリアスを自動登録する方法をお伝えします!

    それではいってみましょう!

    前回のおさらい

    PowerShellをコンソール上からサクッと西暦を和暦に変換する方法をお伝えしています。

    • 関数を短い名前で呼び出せるエイリアスについて ← 前回説明
    • 関数とエイリアスをいつでも呼び出し可能にするプロファイルについて ← 今回説明
    • 西暦を和暦へ変換する関数を作成する
    • 完成した関数とそのエイリアスをプロファイルに登録する

    前回は自作の関数「Hello-World」にエイリアスを設定して「hw」という短いワードで呼び出せるようにしました。

    エイリアスを設定するにはコマンドレット:New-Aliasを使用します。

    New-Alias -Name “エイリアス” 関数名

    そして登録したエイリアスは、コマンドレット:Get-Aliasで確認できるんでしたね。

    これでいつでも短いワードで関数を呼び出せる!そう思って一度PowerShellを終了、再起動したあとにGet-Aliasを実行すると…

    あれ、エイリアスが消えてしまいました…。

    もしかして関数も…

    呼び出すとエラーとなってしまいました。

    実は登録した関数とエイリアスはPowerShellの終了に合わせて消えてしまうのです。。

    プロファイルを使って関数とエイリアスを登録する

    PowerShellを終了すると消えてしまう関数やエイリアス。毎回登録するのは面倒ですよね?

    プロファイルというスクリプトを使うことで解決できます!

    プロファイルとは

    プロファイルとはPowerShellを起動したときに自動的に実行されるスクリプトのことです。

    プロファイルに関数とエイリアスを記述しておくことで、起動時に意識せずともプロファイルが実行され関数とエイリアスが登録されます。

    プロファイルは「略歴」などを意味する言葉ですが、このようにユーザー毎のカスタム仕様を保存しておくことができます。

    プロファイルのフルパスを確認する

    ここからは具体的なプロファイルの作成方法についてご説明します。

    PowerShellが参照するプロファイルの格納場所は自動変数「$profile」で確認することができます。

    コンソールで入力して実行すると…

    このようにプロファイルのフルパスが表示されます。筆者の環境では

    「C:\Users\terad\Documents\WindowsPowerShell\Microsoft.PowerShellISE_profile.ps1」

    がプロファイルのパスになります。

    プロファイルを作成する

    デフォルトの状態ではプロファイルは存在しません。ファイルやディレクトリを作成するコマンドレットNew-Itemでプロファイルを作成しましょう。

    New-Item $profile -force -type file

    forceパラメータを付与すると、ディレクトリが存在しない場合に自動で作成してくれます。

    typeパラメータでは作成するアイテムがディレクトリかファイルを選ぶことができます。プロファイルはファイル形式なので、fileを指定します。

    コンソールで実行すると…

    このようにプロファイルが作成されました!

    プロファイルを編集する

    ISEでプロファイルを編集します。

    pseditを使って指定したファイルをISEで開くことができます。pseditは名称が「動詞-名詞」ではないですよね。コマンドレットではなくPowerShellに標準で用意されている関数です。

    psedit ISEで開きたいファイルのパス

    以下のコマンドをコンソールで入力し実行してください。

    psedit $profile

    ISEでプロファイルが開きました。New-Itemで作成したばかりなのでこのように空っぽです。

    ここに前回作成したHello-Worldとそのエイリアスを直接記述します。

    function Hello-World($str){
        Write-Host ("Hello! " + $str)
    }
     
    New-Alias -Name "hw" Hello-World

    保存したらISEを終了し、もう一度起動してください。

    Get-Aliasで確認すると…

    エイリアス:hwが登録されていますね!

    前回作成した「Hello-World」は、引数で渡した文字列に「Hello!」という文字列を結合してコンソールに表示する関数でした。引数に「プロファイル」という文字列を渡してhwを実行すると…

    エイリアス:hwで関数「Hello-World」を呼び出すことができました!

    プロファイルに記述しておくだけでPowerShellを起動すると関数「Hello-World」、そのエイリアスであるhwが登録されました!

    まとめ

    いかがだったでしょうか。

    PowerShellを終了すると登録した関数やエイリアスは消えてしまいます。そこで関数とエイリアスをプロファイルに記述しておくことで、起動と同時に登録が完了し、いつでも使用できる状態になります。

    プロファイルを使えば、ユーザー毎のカスタム仕様を設定することができますよ!

    でも…PowerShellに関数やエイリアスを「登録してる」と説明してきましたが、いったいどこに登録されているのでしょうか。次回はその登録先である「ドライブ」についてご説明したいと思います、

    では、最後までお読みいただきありがとうございました!

    連載目次:Windowsのポチポチ業務を爆速化するPowerShell

    Windowsのポチポチ業務(マウスを使った業務)を爆速化するために、PowerShellを使った効率化の方法をお伝えしています。
    1. Windowsのポチポチ業務を爆速化するPowerShell、はじめのハードルぐーーんと下げてみます!
    2. Windowsのポチポチ業務を爆速化するPowerShell、キーボードを使わずササっと起動する方法
    3. Windowsのポチポチ操作を爆速化するPowerShellの絶対条件!ディレクトリとその移動をマスターしよう!
    4. Windowsのポチポチ業務を爆速化するPowerShell、コマンドレットを腹の底から理解する!
    5. Windowsのポチポチ業務を爆速化するPowerShell、オンラインヘルプでコマンドレットを使い倒す!
    6. Windowsのポチポチ業務を爆速化するPowerShell、統合開発環境ISEを紹介します!
    7. Windowsのポチポチ業務を爆速化するPowerShell、スクリプトを実行するための準備
    8. Windowsのポチポチ業務を爆速化するPowerShell、フォルダを作るスクリプトの作り方
    9. Windowsのポチポチ業務を爆速化するPowerShell、if文を使いフォルダの有無で処理を分岐させる方法
    10. Windowsのポチポチ業務を爆速化するPowerShell、ForEach-Objectで配列の全要素を処理する方法
    11. Windowsのポチポチ業務を爆速化するPowerShell、パイプラインを使いコマンドレット間で値を引き渡す方法
    12. Windowsのポチポチ業務を爆速化するPowerShell、ファイルを別フォルダにコピーし名称を変更する方法
    13. Windowsのポチポチ業務を爆速化するPowerShell、ファイル名を変更する方法
    14. Windowsのポチポチ業務を爆速化するPowerShell、正規表現で複雑なファイル名変更をする方法
    15. Windowsのポチポチ業務を爆速化するPowerShell、タスクスケジューラでスクリプトを決まった日時に起動する方法
    16. Windowsのポチポチ業務を爆速化するPowerShell、ファイルをバックアップするスクリプトの作り方
    17. Windowsのポチポチ業務を爆速化するPowerShell、関数を作ってスクリプトから呼び出す方法
    18. Windowsのポチポチ業務を爆速化するPowerShell、関数をコンソールで登録して呼び出す方法

    GASでdefinePropertiesメソッドを使ってクラスにプロパティを定義する方法

    $
    0
    0

    みなさん、こんにちは!
    タカハシ(@ntakahashi0505)です。

    「初心者でもわかるGoogle Apps Scriptでクラスを作ろう!」をテーマとしたシリーズをお送りしています。

    前回の記事はこちら。

    Google Apps Scriptでプライベートプロパティを取得するメソッドを作成する方法
    初心者でもわかるGoogle Apps Scriptでクラスを作るシリーズをお送りしています。今回は、GASでクラスのプライベートプロパティを取得するメソッドを作成する方法についてお伝えします。

    GASのクラスでプライベートプロパティを取得するメソッドを作る方法をお伝えしました。

    さて、プライベートプロパティの値を取得する方法、実は別の方法があります。

    それは、Object.definePropertiesメソッドを使う方法です。

    ということで、今回はGoogle Apps ScriptでdefinePropertiesメソッドを使ってプロパティを定義する方法です。

    では、行ってみましょう!

    前回のおさらい

    題材としているのは以下のスプレッドシートの表です。

    スプレッドシートのテーブル

    この表の各行を表すクラスPersonを作成しました。

    こちらのコードです。

    function myFunction() {  
      
      var Person = function(record){
        var _id = record[0];
        this.name = record[1];
        this.gender = record[2];
        this.birthday = record[3];
    
        this.getId = function(){
          return _id;  
        };
      };
      
      var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
      var p = new Person(values[1]);
      Logger.log(p);
      Logger.log(p.getId());
    }

    ご覧の通り、idについては上書きをできないようにプライベートプロパティと、その読み取り用のメソッドで実現をしました。

    ですが、もう少し凝った方法がありまして、それがdefinePropertiesメソッドを使って、オブジェクトにプロパティを直接定義してしまうという方法です。

    definePropertiesメソッドでプロパティを定義する

    definePropertiesメソッドは、オブジェクトに新しいプロパティを定義するメソッドです。

    書式は以下の通りで、指定するオブジェクトにプロパティ名1、プロパティ名2、…と複数のプロパティを定義することができます。

    Object.defineProperties(オブジェクト,
     { プロパティ名1: 構成情報1 },
     { プロパティ名2: 構成情報2 },
     …
    )

    構成情報1、構成情報2、…というのは、以下の形式で個々のプロパティに指定するものになります。

    get: function() {
     //get処理
    },
    set: function(value) {
     //set処理
    }

    「get」には、そのプロパティを取得しようとした際の処理を記述します。一般的には、プライベート変数の値をreturnする処理が含まれます。

    「set」には、そのプロパティに設定しようとした際の処理を記述します。一般的には、プライベート変数の値にvalueを代入する処理が含まれます。

    setとgetはそれぞれ省略することができ、その場合にはそれぞれ読み取り専用、または書き込み専用のプロパティとなります。

    definePropertiesメソッドによるクラスの読み取り専用のプロパティ

    では、definePropertiesメソッドを使って、クラスが持つ「id」の値について、読み取り専用にするスクリプトを見ていきましょう。

    こちらです。

    function myFunction() {  
      
      var Person = function(record){
        var _id = record[0];
        this.name = record[1];
        this.gender = record[2];
        this.birthday = record[3];
        
        Object.defineProperties(this, {
          id: {
            get: function(){
              return _id;
            }
          }
        });
      };
      
      var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
      var p = new Person(values[1]);
      Logger.log(p.id);
      p.id = 'a00';
      Logger.log(p.id); 
      
    }

    9行目~16行目が、プロパティの定義になります。

    definePropertiesにより、プロパティidを定義していて、「get」のみ設定をしていますから、読み取り専用になるのです。

    実行結果がこちらです。

    GASでプロパティを読み取ったログ

    20,22行目でidプロパティの読み取りを行っていますが、これは普通に出力されています。

    一方で、21行目でプロパティidに書き込みをトライしていますが、その上書きはされておらず、初期状態の値がログ出力されていることがわかりますね。

    まとめ

    以上、GASでdefinePropertiesメソッドを使ってクラスにプロパティを定義する方法をお伝えしました。

    前回紹介した、コンストラクタ内にメソッドを定義するよりも、わかりやすくなり、可読性も上がったのではないかと思います。

    どうぞ活用くださいね。

    次回は、コンストラクタをメイン処理の外に出して即時関数化していきます。

    どうぞお楽しみに!

    連載目次:初心者向けGoogle Apps Scriptでクラスを作ろう

    使いどころやそのメリットが分かりづらいGASの「クラス」。本シリーズでは、初心者でもわかるように「これでもか!」とじっくり着実にクラスとそのメリットについて解説をしていきます。
    1. 【初心者向け】Google Apps Scriptでクラスを理解するためのオブジェクトの基礎知識
    2. 初心者でもできるGoogle Apps Scriptで最も簡単なクラスを作る方法
    3. Google Apps Scriptでクラスに最も簡単なプロパティを追加する方法
    4. Google Apps Scriptでクラスに最も簡単なメソッドを追加する方法
    5. Google Apps Scriptでスプレッドシートのデータの1行分を表すクラスを作る方法
    6. Google Apps Scriptのクラスでプライベートプロパティを作成する方法
    7. GASでdefinePropertiesメソッドを使ってクラスにプロパティを定義する方法

    Google Apps Scriptで即時関数にクラスを定義する理由とその方法

    $
    0
    0
    immediate

    photo credit: labuero Bobby Car Race via photopin (license)

    みなさん、こんにちは!
    タカハシ(@ntakahashi0505)です。

    「初心者向けGoogle Apps Scriptでクラスを作る!」シリーズを連載でお伝えしています。

    前回の記事はこちらです。

    GASでdefinePropertiesメソッドを使ってクラスにプロパティを定義する方法
    「初心者でもわかるGoogle Apps Scriptでクラスを作ろう!」をテーマとしたシリーズをお送りしています。今回はGASでdefinePropertiesメソッドを使ってプロパティを定義する方法です。

    クラスにプロパティを定義するdefinePropertiesメソッドの使い方についてお伝えしました。

    今回は、ちょっと方向を変えていきますね…

    即時関数ですよ、即時関数。

    Google Apps Scriptで即時関数にクラスを定義する理由とその方法についてお伝えします。

    では、行ってみましょう!

    前回のおさらい

    まず、以下のようなスプレッドシートの表があります。

    スプレッドシートのテーブル

    この表の各行を表すクラスを作成しているのですが、前回まで作成したのがこちらです。

    function myFunction() {  
      
      var Person = function(record){
        var _id = record[0];
        this.name = record[1];
        this.gender = record[2];
        this.birthday = record[3];
        
        Object.defineProperties(this, {
          id: {
            get: function(){
              return _id;
            }
          }
        });
      };
      
      var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
      var p = new Person(values[1]);
      Logger.log(p.id);
      p.id = 'a00';
      Logger.log(p.id); 
      
    }

    ひとまずクラスとして形になってきましたね。

    ただ、クラスPersonはmyFunctionの中で定義しているので、myFunctionの中でしか使用できないですよね。

    他の関数からもクラスを利用したいときはどうすれば良いでしょうか?

    クラスをグローバルに定義する

    クラスPersonの定義、つまりコンストラクタをグローバルに定義しちゃいましょう。

    var Person = function(record){
        var _id = record[0];
        this.name = record[1];
        this.gender = record[2];
        this.birthday = record[3];
        
        Object.defineProperties(this, {
          id: {
            get: function(){
              return _id;
            }
          }
        });
      };
      
      Person.prototype.greet = function(){
        Browser.msgBox(this.name + "です、こんにちは!");
      };
      
      Person.prototype.log = function(){
        Logger.log('%s|%s|%s|%s|', this.id, this.name, this.gender, this.birthday);
      };

    はい、OKです。

    これでmyFunctionがスッキリです。

    function myFunction() {  
        
      var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
      var p = new Person(values[1]);
      
      p.log();
      
    }

    はい、以上お疲れ様でした!

    …だと、この記事ちょっと密度が薄すぎますね。

    即時関数でスコープを作る

    今回の場合、グローバルに定義したとしても、まあそんなに大きな問題はないのですが、定義する関数や変数が全部グローバルスコープになってしまうのが、ちょっと心配ですよね。

    うっかり、同じ関数や変数があったら、わけがわからない不具合が出ちゃいそうです。

    それを防ぐために、 即時変数でスコープを作るという手があります。

    即時関数とは

    即時関数というのは、一回だけすぐに実行される関数です。

    書式は以下の通り。

    (function(仮引数1, 仮引数2,…) {
     //処理
    })(引数1, 引数2,…)

    名前がなくて、かっこで囲まれている感じですよね。

    GASの話ですが、プロジェクト内のいずれかの関数が実行されたとき、グローバルに定義されているステートメントはその時点ですべて実行されます。

    ですから、その辺のグローバルにポロっと置いてあるステートメントを、即時関数の中に入れ込んであげるんです。

    すると、即時関数も関数ですから、その内部の変数や処理がローカルスコープに閉じ込めることができるというわけです。

    すごいぞ!即時関数!

    クラスを即時関数内に定義する

    では、今回のクラスPersonをグローバル領域の即時関数内に定義してみましょう。

    こちらです。

    (function(global){
    
      var Person = function(record){
        var _id = record[0];
        this.name = record[1];
        this.gender = record[2];
        this.birthday = record[3];
        
        Object.defineProperties(this, {
          id: {
            get: function(){
              return _id;
            }
          }
        });
      };
      
      Person.prototype.greet = function(){
        Browser.msgBox(this.name + "です、こんにちは!");
      };
      
      Person.prototype.log = function(){
        Logger.log('%s|%s|%s|%s|', this.id, this.name, this.gender, this.birthday);
      };
    
      global.Person = Person;
    
    })(this);

    先ほどのmyFunctionを実行すると、ちゃんと以下のようにログが出力されるはずです。

    インスタンスのデータをログを出力する

    thisとglobalの意味

    さて、この即時関数ですが、引数としてthisを渡して、それをglobalで受け取ってますね。

    そしてさらに26行目ですが、globalのPersonにPersonを渡すという謎の処理が見受けられます。

    これについて、ちゃんと理解しておく必要があります。

    まず、thisですが、コンストラクタ内で使われているthisとは全く別の意味があります。

    ここで使われているthisはグローバルのthisなのですが、その場合のthisはグローバルオブジェクトを表します。

    それを、即時関数の仮引数のglobalに渡していますが、これはただの即時関数内で使用する仮引数です。

    別にhogeでも良いわけです。

    そして26行目。

    global.Person = Person

    これは、即時関数内で宣言したPersonをグローバルオブジェクトにも定義しているということですね。

    ほら、コンストラクタPersonは即時関数内にありますからそのままではローカルスコープ。つまり、他の関数からは使用することができません。

    それを、グローバルオブジェクトに渡すことで、プロジェクト内のすべての関数から呼び出すことができるようになるわけです。

    まとめ

    以上、Google Apps Scriptで即時関数にクラスを定義する理由とその方法についてお伝えしました。

    GAS(というかJavaScript)はスコープがすごく重要ですよね。

    あと、this。使う場所によって役割が変わりますので、要注意ですね。

    次回は、インスタンスの集合を取り扱いしていきます。

    どうぞお楽しみに!

    連載目次:初心者向けGoogle Apps Scriptでクラスを作ろう

    使いどころやそのメリットが分かりづらいGASの「クラス」。本シリーズでは、初心者でもわかるように「これでもか!」とじっくり着実にクラスとそのメリットについて解説をしていきます。
    1. 【初心者向け】Google Apps Scriptでクラスを理解するためのオブジェクトの基礎知識
    2. 初心者でもできるGoogle Apps Scriptで最も簡単なクラスを作る方法
    3. Google Apps Scriptでクラスに最も簡単なプロパティを追加する方法
    4. Google Apps Scriptでクラスに最も簡単なメソッドを追加する方法
    5. Google Apps Scriptでスプレッドシートのデータの1行分を表すクラスを作る方法
    6. Google Apps Scriptのクラスでプライベートプロパティを作成する方法
    7. GASでdefinePropertiesメソッドを使ってクラスにプロパティを定義する方法

    Google Apps Scriptでスプレッドシートの表をインスタンス配列化する方法

    $
    0
    0
    array

    photo credit: wwward0 tokyobike(s) via photopin (license)

    みなさん、こんにちは!
    タカハシ(@ntakahashi0505)です。

    「初心者でもわかるGoogle Apps Scriptのクラス」をテーマにシリーズ連載をお送りしております。

    前回の記事はこちら。

    Google Apps Scriptで即時関数にクラスを定義する理由とその方法
    「初心者向けGoogle Apps Scriptでクラスを作る!」シリーズをお伝えしています。今回は、GASで即時関数にクラスを定義する理由とその方法についてお伝えします。スコープとthisが重要な役割を果たします。

    クラスの定義を即時関数化しました。

    さて、今回はスプレッドシートの表について、インスタンス配列化していきます。

    もともと、そこが目標でしたからね。

    ということで、Google Apps Scriptでスプレッドシートの表をインスタンス配列化する方法です。

    では、行ってみましょう!

    前回のおさらい

    お題としているスプレッドシートはこちらです。

    スプレッドシートのテーブル

    この一行ずつを表すクラスを前回まで作成しておりました。

    そのコードがこちらですね。

    (function(global){
    
      var Person = function(record){
        var _id = record[0];
        this.name = record[1];
        this.gender = record[2];
        this.birthday = record[3];
        
        Object.defineProperties(this, {
          id: {
            get: function(){
              return _id;
            }
          }
        });
      };
      
      Person.prototype.greet = function(){
        Browser.msgBox(this.name + "です、こんにちは!");
      };
      
      Person.prototype.log = function(){
        Logger.log('%s|%s|%s|%s|', this.id, this.name, this.gender, this.birthday);
      };
    
      global.Person = Person;
    
    })(this);

    そして、その検証用のmyFunctionがこちら。

    function myFunction() {  
        
      var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
      var p = new Person(values[1]);
      
      p.log();
      
    }

    …まあ、そんなにたいしたことしていませんが汗。

    さて、スプレッドシートの一行分のクラスを作ったのはわかったのですが、表全体はまだ上手に取り扱えていない感じです。

    ということで、今回はスプレッドシートの表を取り扱えるようにしていきますよ。

    スプレッドシートをインスタンスの配列として格納する

    それで、GASの場合は「集合」を取り扱うのであれば、配列がすごく便利なんですよね~。

    例えば、変数personsを配列として用意して、そこに各行を表すPersonクラスのインスタンスを要素として追加していけば良さそうです。

    そのスクリプトがこちらです。

    function myFunction() {  
        
      var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
      var persons = [];
      values.shift();
      for(var i = 0; i < values.length; i++){
        persons[i] = new Person(values[i]);
        persons[i].log();
      }
     
    }

    実行すると…

    スプレッドシートの表をインスタンスの配列にしてログ出力した

    おー、いい感じですね!

    配列から見出し行を取り除く

    5行目のshiftメソッドだけ紹介しておきますね。

    これはArrayオブジェクトに用意されているメソッドで、配列の最初の要素を取り除くというものです。

    Arrayオブジェクト.shift()

    戻り値は取り除いた要素ですが、破壊的メソッドですので対象となるオブジェクトについて操作して変化を加えちゃいます。

    変数valuesは二次元配列になっていて、最初の要素は取得した範囲の一行目、つまり見出し行の配列になっているので、それを取り除いちゃってるわけですね。

    二次元配列から見出し行を取り除きたいときに、便利っすよ!

    まとめ

    以上、Google Apps Scriptでスプレッドシートの表をインスタンス配列化する方法でした。

    GASの配列、便利っすよね!

    さて、今回は配列で集合を表したわけですが、これもクラス化していきたいですよね。

    次回は、そのあたりを進めていきます。

    どうぞお楽しみに!

    連載目次:初心者向けGoogle Apps Scriptでクラスを作ろう

    使いどころやそのメリットが分かりづらいGASの「クラス」。本シリーズでは、初心者でもわかるように「これでもか!」とじっくり着実にクラスとそのメリットについて解説をしていきます。
    1. 【初心者向け】Google Apps Scriptでクラスを理解するためのオブジェクトの基礎知識
    2. 初心者でもできるGoogle Apps Scriptで最も簡単なクラスを作る方法
    3. Google Apps Scriptでクラスに最も簡単なプロパティを追加する方法
    4. Google Apps Scriptでクラスに最も簡単なメソッドを追加する方法
    5. Google Apps Scriptでスプレッドシートのデータの1行分を表すクラスを作る方法
    6. Google Apps Scriptのクラスでプライベートプロパティを作成する方法
    7. GASでdefinePropertiesメソッドを使ってクラスにプロパティを定義する方法
    8. Google Apps Scriptで即時関数にクラスを定義する理由とその方法

    Google Apps Scriptでデータの集合を表すクラスを作成する方法

    $
    0
    0

    みなさん、こんにちは!
    タカハシ(@ntakahashi0505)です。

    「初心者でもわかるGoogle Apps Scriptのクラス」をテーマにシリーズ連載をお送りしております。

    前回の記事はこちら。

    Google Apps Scriptでスプレッドシートの表をインスタンス配列化する方法
    「初心者でもわかるGoogle Apps Scriptのクラス」をテーマにシリーズ連載をお送りしております。今回は、GASでスプレッドシートの表をインスタンス配列化する方法をおお送りします。

    スプレッドシートの表のデータを、独自クラスのインスタンスの配列にする方法をお伝えしました。

    以降、この配列化した「データの集合」に対しても色々な処理をしていきたいわけなので、今回はその「データの集合」をクラス化していきますよ。

    Google Apps Scriptでデータの集合を表すクラスを作成する方法です。

    では、行ってみましょう!

    前回のおさらい

    対象としているスプレッドシートは以下のようなものです。

    スプレッドシートのテーブル

    まずは、この一行ずつのデータを表すクラスを作成しました。

    こちらのクラスPersonです。

    (function(global){
    
      var Person = function(record){
        var _id = record[0];
        this.name = record[1];
        this.gender = record[2];
        this.birthday = record[3];
        
        Object.defineProperties(this, {
          id: {
            get: function(){
              return _id;
            }
          }
        });
      };
      
      Person.prototype.greet = function(){
        Browser.msgBox(this.name + "です、こんにちは!");
      };
      
      Person.prototype.log = function(){
        Logger.log('%s|%s|%s|%s|', this.id, this.name, this.gender, this.birthday);
      };
    
      global.Person = Person;
    
    })(this);

    このクラスのインスタンスが、先ほどのスプレッドシートの一行分を表すPersonオブジェクトとなります。

    データ行は複数ありますので、それを配列化する処理を以下のmyFunctionで作成しました。

    function myFunction() {  
        
      var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
      var persons = [];
      values.shift();
      for(var i = 0; i < values.length; i++){
        persons[i] = new Person(values[i]);
        persons[i].log();
      }
     
    }

    ただ、どうせスプレッドシートの表から全部のデータを取得してインスタンス化しますし、そのデータの集合についても処理を追加していきたくなります。

    なので、その「データの集合」を表すクラスPersonsも作っておきたいかなと思います。

    今回は、その部分を進めていきます。

    スプレッドシートのデータ行の集合を扱うクラスを作る

    それでは、スプレッドシートのデータ行の集合を表すクラスを作っていきましょう。

    前述のmyFunctionの処理を、即時関数内のコンストラクタPersonsに置き換えていけば良さそうですよね。

    以下のようにつくりましたよ。

    (function(global){
    
      var Persons = function() {
    
        var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
        values.shift();
        
        this.persons = [];
        for(var i = 0; i < values.length; i++){
          this.persons[i] = new Person(values[i]);
        }      
        
      };
      
      global.Persons = Persons;
    
    })(this);

    コンストラクタPersonは、プロパティpersonsに配列を持ちます。

    その配列は、スプレッドシートから取得したデータを元に生成したインスタンスの配列となります。

    クラスPersonsの動作を確認する

    では、クラスPersonの動作を確認していきましょう。

    結果を検証するために、関数myFunctionを以下のように変更してみました。

    function myFunction() {  
      
      var persons = new Persons();
      for(var i = 0; i < persons.persons.length; i++){
        persons.persons[i].log();
      }
        
    }

    実行すると、以下のように正しく出力されます。

    クラスPersonsが持つデータをログ出力

    インスタンスのプロパティを省略したい

    ただ、先ほどのmyFunction…「persons.persons.length」とか、「persons.persons[i].log()」とか、ちょっと操作する命令を書くのがうざいです。

    それもそのはず。

    というのも、Personsオブジェクトの主データである配列は以下の表記のように、personsプロパティを使ってはじめて取り出せるわけですよね。

    Personsオブジェクト.persons

    それで取り出した配列の要素がPersonオブジェクトですから、それに対してlogメソッドなんかを使ったりします。

    PersonsオブジェクトからPersonオブジェクトを取り出すのにプロパティが必要で、その取り出した値にさらにプロパティやメソッド…と二段構えになるので、ステートメントが長くなっちゃうんですね。

    んー、もっとコンパクトに記述して取り扱いたいですよね。

    オブジェクトでデータの集合を表す

    データの集合を表す方法は配列のほかに、オブジェクトがあります。

    Personsクラスに「id」をプロパティにして、そのidを持つPersonオブジェクトを値として格納するように変えてみてはどうでしょうか。

    (function(global){
    
      var Persons = function() {
    
        var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
        values.shift();
        
        for(var i = 0; i < values.length; i++){
          var p = new Person(values[i]);
          this[p.id] = p;
        }      
      };
      
      global.Persons = Persons;
    
    })(this);

    GASは配列が便利なイメージありますが、こちらも比較的スッキリしていますね。

    オブジェクトとしてデータを持つクラスの動作を確認

    では、オブジェクトとしてデータを持つクラスPersonの動作を確認していきましょう。

    関数myFunctionはこんな感じです。

    function myFunction() {  
      
      var persons = new Persons();
      for(var id in persons){
        persons[id].log();
      }      
        
    }

    おお…けっこうスッキリですね。

    ひとまず、今回はこちらのほうが良さそうです。

    まとめ

    以上、Google Apps Scriptでデータの集合を表すクラスを作成する方法をお伝えしました。

    「データの集合を表すクラス」の表現方法、今回はオブジェクトが良さそうでしたが、他にも様々な方法があると思いますので、ぜひ研究をしてみてくださいね。

    では、次回以降、作成したPersonsクラスに色々な処理を追加していきます。

    どうぞお楽しみに!

    連載目次:初心者向けGoogle Apps Scriptでクラスを作ろう

    使いどころやそのメリットが分かりづらいGASの「クラス」。本シリーズでは、初心者でもわかるように「これでもか!」とじっくり着実にクラスとそのメリットについて解説をしていきます。
    1. 【初心者向け】Google Apps Scriptでクラスを理解するためのオブジェクトの基礎知識
    2. 初心者でもできるGoogle Apps Scriptで最も簡単なクラスを作る方法
    3. Google Apps Scriptでクラスに最も簡単なプロパティを追加する方法
    4. Google Apps Scriptでクラスに最も簡単なメソッドを追加する方法
    5. Google Apps Scriptでスプレッドシートのデータの1行分を表すクラスを作る方法
    6. Google Apps Scriptのクラスでプライベートプロパティを作成する方法
    7. Google Apps Scriptでプライベートプロパティを取得するメソッドを作成する方法
    8. GASでdefinePropertiesメソッドを使ってクラスにプロパティを定義する方法
    9. Google Apps Scriptで即時関数にクラスを定義する理由とその方法
    10. Google Apps Scriptでスプレッドシートの表をインスタンス配列化する方法

    【QUERY関数】where句と比較演算子を使って単一条件に一致した行を抽出する

    $
    0
    0

    QUERY関数3アイキャッチ-3

    みなさんこんにちは!
    もり(@moripro3)です。

    GoogleスプレッドシートQUERY関数の使い方をシリーズでお届けしています!

    前回はQUERY関数の超基本!select句で列を抽出する方法を紹介しました。

    QUERY関数の基本!別シートのデータからselect句で列を取得する方法
    GoogleスプレッドシートのQUERY関数を紹介するシリーズ。第二回目は、select句で特定の列を抽出する方法です。1列のみ・複数列・すべての列を抽出する書き方を紹介しています。

    今回の記事では、where句と比較演算子を使用して、指定条件に一致する「行」を抽出する方法を紹介します。

    それではみていきましょう!

    QUERY関数のwhere句とは?

    where句とは、データの中から、指定条件に一致する行を抽出する句です。

    where句を使うと何ができるのかを、サンプル「備品購入リスト」でご紹介します。このリストから、B列が「OA機器」の行を抽出してみます。

    query3-1

    ↓ B列「区分」が’OA機器’の行のみを抽出

    query3-15

    条件に一致する5行が抽出できました。

    このように、データの中から、指定の条件に一致する「行」を抽出するときに使うのがwhere句の役割です。

    QUERY関数のwhere句を使うメリット

    「行の抽出」と聞くと、フィルタ機能を思い浮かべる方もいるでしょう。B列「区分」でフィルタをかければ、同様の結果が取得できますね。

    シリーズ初回の記事でお伝えしたQUERY関数のメリットを再度お伝えします!

    1. 「元データ」と「抽出データ」を別々のシートに分けて管理できる
    2. 一度セルに関数を入力すれば、元データに変更が発生しても、自動で結果が反映される

    query3-16

     

    フィルタ機能で行抽出をする場合、元データが変わるたびに手動でポチポチと設定しなおす必要がありますね。

    また、データ全体を確認したいときに、フィルタを解除する手間も発生します。

    元データと抽出データを別々のシートに分けて管理できることで、確認したいデータを、スムーズにチェックすることができます。

    前回までのおさらい:構文と別シートの参照

    QUERY関数の構文がこちらです。3つの引数を指定します。

    QUERY(データ, クエリ, [見出し])

    「データ」が参照するサンプルデータの情報が下記なので、

    • シート名:備品購入リスト
    • データ範囲:A列~E列

    第1引数は‘備品購入リスト’!A:Eと指定します。シート名をシングルクォートで囲み、!を付けます。

    where句の条件指定に使う比較演算子

    where句で使える比較演算子の一覧です。文字列との比較・数値との比較が可能です。

    演算子 意味
    = ~と等しい
    <>または!= ~と等しくない
    > ~より大きい
    >= ~以上
    < ~より小さい(未満)
    <= ~以下

    次の項から、これらの演算子を使って行の抽出をしてみましょう!

    単一条件で行を抽出する

    where句の最も簡単な使い方を紹介します。条件を1つだけ指定して、行を抽出します。

    where 条件

    抽出条件に「文字列」を指定する

    B列「区分」がOA機器の行を抽出します。抽出条件の値が文字列の場合は、シングルクォートで囲みます。

    ここではすべての列を抽出するので、select句にアスタリスク(*)を指定します。select句の使用方法は前回の記事をご覧ください。

    =query('備品購入リスト'!A:E,"select * where B = 'OA機器'",1)

    query3-2

    比較演算子の<>(~と等しくない)を使用すると、「~以外」の行を抽出することができます。OA機器以外の行を抽出する書き方です。

    =query('備品購入リスト'!A:E,"select * where B <> 'OA機器'",1)

    query3-17

    ※QUERY関数ですべての列を抽出する場合、select句を省略することも可能です。

    =query('備品購入リスト'!A:E,"where B = 'OA機器'",1)

    ただし、「すべての列を抽出する」ことを明示するために、この記事ではselect句を記述しています。

    抽出条件に「数値」を指定する

    where句の抽出条件には数値も指定できます。

    備品購入リストから、D列「単価」が1,000円未満の行を抽出します。使用する比較演算子は<(~より小さい・未満)です。

    数値と比較する場合、数値をシングルクォートで囲む必要はありません。

    =query('備品購入リスト'!A:E,"select * where D < 1000",1)

    query3-4

    つづいて、1,000円以下の行を抽出してみます。

    使用する比較演算子は<=(~以下)です。「以下」の場合は、1000も含まれますね。

    =query('備品購入リスト'!A:E,"select * where D <= 1000",1)

    query3-5

    比較演算子 < と <= の使い分けは注意しましょう!(> と => も)

    • 列 < x(xより小さい)… xは含まない
    • 列 <= x(x以下)… xを含む

      まとめ

      今回の記事では、where句と比較演算子を使用して、条件に一致する行を抽出する方法をお伝えしました。

      • where句を使用すると、指定条件に一致する行を抽出できる
      • 条件の指定に「比較演算子」を使う( =, !=, <>,<=, <, >, >= )

      この記事では「単価が1,000円未満」といった、条件を1つだけ指定する方法を紹介しました。where句では「区分がxx かつ 単価がxx」という複数条件の指定も可能です。シリーズを通して紹介していきます。

      さて、次回も引き続きwhere句をお伝えします。空白行の抽出・部分一致で検索など、ちょっとマニアックな方法を紹介します!

      どうぞお楽しみに!

      連載目次:GoogleスプレッドシートQUERY関数をマスターしよう

      スプレッドシートのQUERY関数を使って、データ抽出・集計を効率化する方法を紹介しています。

      1. スプレッドシートのQUERY関数を使う最初の一歩!クエリを理解する
      2. QUERY関数の基本!別シートのデータからselect句で列を取得する方法

      Google Apps Scriptで自作オブジェクトについてプロパティを追加・削除するメソッドの作り方

      $
      0
      0
      add-remove

      photo credit: wuestenigel Colorful kids abacus via photopin (license)

      みなさん、こんにちは!
      タカハシ(@ntakahashi0505)です。

      「初心者でもわかるGoogle Apps Scriptのクラス」をテーマにシリーズ連載をお送りしております。

      前回の記事はこちら。

      Google Apps Scriptでデータの集合を表すクラスを作成する方法
      「初心者でもわかるGoogle Apps Scriptのクラス」をテーマにお送りしております。今回は、GASでスプレッドシートのデータの集合を表すクラスを作成する方法をお伝えしていきます。

      スプレッドシートのデータ行の集合を表すクラスPersonsを作成しました。

      今回は、そのPersonsクラスにメソッドを追加していきますよ。

      ということで、Google Apps Scriptで自作オブジェクトについてプロパティを追加・削除するメソッドの作り方です。

      では、行ってみましょう!

      前回のおさらい

      まず、題材としているスプレッドシートですが、こちらになります。

      スプレッドシートのテーブル

      この各行を表すクラスPersonを以下のようにつくりました。

      (function(global){
      
        var Person = function(record){
          var _id = record[0];
          this.name = record[1];
          this.gender = record[2];
          this.birthday = record[3];
          
          Object.defineProperties(this, {
            id: {
              get: function(){
                return _id;
              }
            }
          });
        };
        
        Person.prototype.greet = function(){
          Browser.msgBox(this.name + "です、こんにちは!");
        };
        
        Person.prototype.log = function(){
          Logger.log('%s|%s|%s|%s|', this.id, this.name, this.gender, this.birthday);
        };
      
        global.Person = Person;
      
      })(this);

      このクラスから生成するPersonクラスは、前述のスプレッドシートの一行分を表すものですから、表全体を表すのはその集合となります。

      それで作成したのが、以下のPersonsクラスです。

      (function(global){
      
        var Persons = function() {
      
          var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
          values.shift();
          
          for(var i = 0; i < values.length; i++){
            var p = new Person(values[i]);
            this[p.id] = p;
          }      
        };
        
        global.Persons = Persons;
      
      })(this);

      スプレッドシートの見出し以外のデータ行について、Personクラスを生成します。

      そしてそれらを、idをプロパティ、インスタンスのPersonオブジェクトを値としてオブジェクト形式で持つようにしました。

      その確認用の関数myFunctionがこちらですね。

      function myFunction() {  
        
        var persons = new Persons();
        for(var id in persons){
          persons[id].log();
        }      
          
      }

      今回は、このPersonsクラスにインスタンスの追加と削除をするメソッドを追加していきますよ。

      自作クラスにメソッドを追加する

      クラスにメソッドを追加するには、以下の記事でお伝えしたとおり、コンストラクタのprototypeプロパティに追加していくんでしたね。

      Google Apps Scriptでクラスに最も簡単なメソッドを追加する方法
      「初心者でもわかるGoogle Apps Scriptのクラスを作ろう!」のシリーズをお送りしています。今回はGASでクラスに最も簡単なメソッドを追加する方法です。プロトタイプについても解説していますよ。

      オブジェクトに新しいプロパティを追加するメソッド

      Personsオブジェクトに、新しいPersonオブジェクトを作成してプロパティとして追加するaddメソッドとを作成しました。

      こちらです。

      Persons.prototype.add = function(record){
          var p = new Person(record);
          this[p.id] = p;
          return this[p.id];
        };

      addメソッドで受け取った仮引数recordを元に、Personクラスのインスタンスを生成して、それをPersonsオブジェクト自身にidをプロパティとして追加するというものですね。

      ちなみに、recordはid,name,gender,birthdayを要素として持つ配列ですね。

      オブジェクトから指定のプロパティを削除するメソッド

      今度は、Personsオブジェクトから、指定したidのPersonオブジェクトを削除するremoveメソッドです。

      オブジェクトからプロパティを削除するには、delete演算子を使いますね。

      delete オブジェクト[プロパティ]

      それを使って作成したdeleteメソッドがこちらです。

      Persons.prototype.remove = function(id){
          delete this[id];
        };

      プロパティを追加・削除するメソッドの動作確認

      では、Personsオブジェクトにプロパティを追加するメソッド、およびPersonsオブジェクトからプロパティを削除するメソッドの動作確認をしていきましょう。

      検証用の関数myFunctionはこちら。

      function myFunction() {  
        
        var persons = new Persons();
        persons.add(['a04', 'Jay', 'male', new Date('1995/7/7')]);
        persons.remove('a01');
        Logger.log(persons);
        
      //  for(var id in persons){
      //    persons[id].log();
      //  }      
          
      }

      8~10行目がコメントアウトされているのは…ちょっと意味がありますので、それについては後日解説します。

      それで、検証としては6行目に以下のようにブレークポイントを置いて、虫アイコンによる「デバッグ実行」を使ってみようと思います。

      ブレークポイントを置いてデバッグ実行

      デバッグ実行をするとブレークポイントで止まりますので、その時点でpersons→a04と開いていくと、以下のように内容を確認できます。

      ブレークポイントでプロパティの追加と削除を確認する

      a04プロパティの追加と、a01削除のプロパティを確認できましたね。

      まとめ

      以上、Google Apps Scriptで自作オブジェクトについてプロパティを追加・削除するメソッドの作り方をお伝えしました。

      追加するプロパティに値を代入すれば追加、削除はdelete演算子ですね。

      次回は、Personsクラスについてループを回すときに困ったことが起こるので、その点を解決していきます。

      どうぞお楽しみに!

      連載目次:初心者向けGoogle Apps Scriptでクラスを作ろう

      使いどころやそのメリットが分かりづらいGASの「クラス」。本シリーズでは、初心者でもわかるように「これでもか!」とじっくり着実にクラスとそのメリットについて解説をしていきます。
      1. 【初心者向け】Google Apps Scriptでクラスを理解するためのオブジェクトの基礎知識
      2. 初心者でもできるGoogle Apps Scriptで最も簡単なクラスを作る方法
      3. Google Apps Scriptでクラスに最も簡単なプロパティを追加する方法
      4. Google Apps Scriptでクラスに最も簡単なメソッドを追加する方法
      5. Google Apps Scriptでスプレッドシートのデータの1行分を表すクラスを作る方法
      6. Google Apps Scriptのクラスでプライベートプロパティを作成する方法
      7. Google Apps Scriptでプライベートプロパティを取得するメソッドを作成する方法
      8. GASでdefinePropertiesメソッドを使ってクラスにプロパティを定義する方法
      9. Google Apps Scriptで即時関数にクラスを定義する理由とその方法
      10. Google Apps Scriptでスプレッドシートの表をインスタンス配列化する方法
      11. Google Apps Scriptでデータの集合を表すクラスを作成する方法
      12. Google Apps Scriptで自作オブジェクトについてプロパティを追加・削除するメソッドの作り方

      Google Apps Scriptでオブジェクトに直接追加しているプロパティだけループする方法

      $
      0
      0

      みなさん、こんにちは!
      タカハシ(@ntakahashi0505)です。

      「初心者でもわかるGoogle Apps Scriptのクラス」をテーマにシリーズ連載をお送りしております。

      前回の記事はこちら。

      Google Apps Scriptで自作オブジェクトについてプロパティを追加・削除するメソッドの作り方
      「初心者でもわかるGoogle Apps Scriptのクラス:をテーマにお送りしております。今回は、GASで自作のオブジェクトについてプロパティを追加するメソッドと削除するメソッドの作り方です。

      自作オブジェクトについてプロパティを追加したり削除したりするメソッドの作り方をお伝えしました。

      さて、その前回の記事でメソッドを作ったわけですが、そのおかげでfor~in文のループ対象にメソッドも入っちゃうという困ったことが起きちゃいます。

      今回は、それをObject.keysメソッドを使って回避する方法をお伝えしていきます。

      ということで、Google Apps Scriptでオブジェクトに直接追加しているプロパティのみをループする方法です。

      では、行ってみましょう!

      前回のおさらい

      まず、対象としているスプレッドシートは以下のようなものです。

      スプレッドシートのテーブル

      まず、この一行ずつのデータを表すクラスを作りましたが、それが以下のコードです。

      (function(global){
      
        var Person = function(record){
          var _id = record[0];
          this.name = record[1];
          this.gender = record[2];
          this.birthday = record[3];
          
          Object.defineProperties(this, {
            id: {
              get: function(){
                return _id;
              }
            }
          });
        };
        
        Person.prototype.greet = function(){
          Browser.msgBox(this.name + "です、こんにちは!");
        };
        
        Person.prototype.log = function(){
          Logger.log('%s|%s|%s|%s|', this.id, this.name, this.gender, this.birthday);
        };
      
        global.Person = Person;
      
      })(this);

      各フィールドを格納するプロパティと、いくつかの単純なメソッドで構成されています。

      そして、スプレッドシートにはそのデータが複数行ありますので、それをオブジェクトを使った集合として取り扱うべく、もう一つクラスを作りました。

      (function(global){
      
        var Persons = function() {
      
          var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
          values.shift();
          
          for(var i = 0; i < values.length; i++){
            var p = new Person(values[i]);
            this[p.id] = p;
          }      
        };
        
        Persons.prototype.add = function(record){
          var p = new Person(record);
          this[p.id] = p;
          return this[p.id];
        };
        
        Persons.prototype.remove = function(id){
          delete this[id];
        };
        
        global.Persons = Persons;
      
      })(this);

      このクラスPersonsについて、要素を追加するaddメソッドと、要素を削除するdeleteメソッドを追加したのが前回でした。

      メソッドもプロパティであることから起こる問題

      さて、このクラスPersonsですが、生成したインスタンスにはidをプロパティに、Personオブジェクトを値に、データを集合として扱うオブジェクトのもとになります。

      ですが、上記2つのメソッドを追加したことで、ちょっと困ったことが既に起こっています。

      以下のようなスクリプトを実行すると、どのような困ったことが起きているかがわかります。

      function myFunction() {  
        
        var persons = new Persons();  
        for(var id in persons){
          persons[id].log();
        }      
          
      }

      スプレッドシートからデータを取得し、Personsクラスのインスタンスを作ります。

      そして、その内容をfor~in文を使ってログ出力しようとするものです。

      ただ、実行すると…

      オブジェクトのループではメソッドも対象になってエラーになる

      このように、「TypeError: オブジェクト function (record) {…} で関数 log が見つかりません。」というエラーが出てしまうのです。

      原因はわかりますか?

      for~in文のループはメソッドも対象になる

      for~in文は、オブジェクト内のすべてのプロパティを取り出してループをするステートメントです。

      今回の例でいうと、以下の3つがPersonsオブジェクトのメンバーとして期待しちゃいますよね。

      1. プロパティa01: BobのPersonオブジェクト
      2. プロパティa02: TomのPersonオブジェクト
      3. プロパティa03: IvyのPersonオブジェクト

      ただ、思い出してください。

      プロパティに関数を格納したものが、メソッドでしたよね。

      てことは、以下の2つのメソッドもfor~in文のループの対象となります。

      1. プロパティadd: add関数の処理
      2. プロパティremove: remove関数の処理

      これらの値は、Personオブジェクトではありませんから、logメソッドを実行できない…したがってエラーが出るというわけです。

      オブジェクトに直接追加したプロパティのみをループする

      それで、どうするか…ということなのですが、addメソッドもremoveメソッドも、オブジェクトに直接追加しているメソッドではなく、コンストラクタのprototypeプロパティに追加しているという点に注目します。

      オブジェクトに直接追加しているプロパティだけ取り出す便利なメソッドがありまして、それがObject.keysメソッドです。

      以下のように記述することで、指定したオブジェクトの直接追加しているプロパティのみを配列で取得します。

      Object.keys(オブジェクト)

      ちなみに、以下の記事で以前お伝えしたdefinePropertiesメソッドによるプロパティは除外されます。

      GASでdefinePropertiesメソッドを使ってクラスにプロパティを定義する方法
      「初心者でもわかるGoogle Apps Scriptでクラスを作ろう!」をテーマとしたシリーズをお送りしています。今回はGASでdefinePropertiesメソッドを使ってプロパティを定義する方法です。

      純粋に直接追加されたプロパティだけを抽出してくれるんですね。

      Object.keysメソッドを使ったループ

      では、早速使用してみましょう。

      Object.keysメソッドは配列を返しますので、forEachメソッドでループできますね。

      関数myFunctionを以下のように変更しました。

      function myFunction() {  
        
        var persons = new Persons();
      
        Object.keys(persons).forEach(
          function(id) {
            persons[id].log();
          }
        );  
          
      }

      実行すると、エラーも発生せず、以下のように正しいログ出力を得ることができました。

      Object.keysで取得した配列にループした結果

      まとめ

      以上、Google Apps Scriptでオブジェクトに直接追加しているプロパティのみをループする方法をお伝えしました。

      オブジェクトのループは、for~in文だけというわけにはいかないんですね。

      勉強になります。

      では、次回ですがいよいよPersonsオブジェクトをスプレッドシートに反映する処理を作っていきたいと思います。

      どうぞお楽しみに!

      連載目次:初心者向けGoogle Apps Scriptでクラスを作ろう

      使いどころやそのメリットが分かりづらいGASの「クラス」。本シリーズでは、初心者でもわかるように「これでもか!」とじっくり着実にクラスとそのメリットについて解説をしていきます。
      1. 【初心者向け】Google Apps Scriptでクラスを理解するためのオブジェクトの基礎知識
      2. 初心者でもできるGoogle Apps Scriptで最も簡単なクラスを作る方法
      3. Google Apps Scriptでクラスに最も簡単なプロパティを追加する方法
      4. Google Apps Scriptでクラスに最も簡単なメソッドを追加する方法
      5. Google Apps Scriptでスプレッドシートのデータの1行分を表すクラスを作る方法
      6. Google Apps Scriptのクラスでプライベートプロパティを作成する方法
      7. Google Apps Scriptでプライベートプロパティを取得するメソッドを作成する方法
      8. GASでdefinePropertiesメソッドを使ってクラスにプロパティを定義する方法
      9. Google Apps Scriptで即時関数にクラスを定義する理由とその方法
      10. Google Apps Scriptでスプレッドシートの表をインスタンス配列化する方法
      11. Google Apps Scriptでデータの集合を表すクラスを作成する方法
      12. Google Apps Scriptで自作オブジェクトについてプロパティを追加・削除するメソッドの作り方

      【エクセルVBA】入力規則のドロップダウンリストを複数連動させる方法

      $
      0
      0

      vba,validation,list

      皆様こんにちは、ノグチです。

      前回の記事では、エクセルの入力規則のドロップダウンリストにセットする文字列の文字数制限と、どんな方法で文字列をセットするとこの文字数制限にひっかかるのか?を検証してご紹介しました。

      【エクセルVBA】255文字を超えたらどうなるの?入力規則のリスト設定方法あれこれ
      エクセルの入力規則にあるリストで作成できるドロップダウンリスト。ドロップダウンリストに表示したい文字列は255文字の制限がありますが、255文字を超えて文字列をドロップダウンリストに指定するとどうなるのか、この文字制限はどの指定方法に適用されるのか?を検証しています。

      そして今回もまた、この入力規則のドロップダウンリストについてご紹介していきます。

      ドロップダウンAから文字列を選択したら、選択した文字列に関連する文字列だけドロップダウンBに表示させたいな~となんてこと、ありませんか?

      例えば通販サイトで、欲しいボールペンを選択したら、そのボールペンで販売されている色だけがドロップダウンリストに表示される…というイメージです。

      エクセルでも、見積書や請求書を作成するツールにあると便利ですよね。

      それ、VBAなら作れるかもしれませんよ。

      ということで今回は、VBAで複数のドロップダウンリストを連動して使う方法をご紹介します。

      ドロップダウンリストを連動させる為の4ステップ

      では早速、こちらのワークシートのB2セルにあるプルダウンリストから文字列を選択したら、選択した文字列をG列に持つH列の文字列だけをC2列のドロップダウンリストに表示させられるようにしてみましょう。

      validation,sheet

      例えば、B2セルのドロップダウンリストから「いちご」を選択したら、G列に「いちご」を持つH列の「佐賀」「福岡」「栃木」という文字列をC2セルのドロップダウンリストに表示させる、という場合です。

      文字で見てみるとちょっと難しそうに思えてしまうかもしれませんが、やることをステップに分けて考えればそこまで難しくありません。

      下記4ステップでコードを作ってみましょう。

      1. Worksheet.Changeイベントで、B2セルのドロップダウンリストが選択されたことをキャッチ
      2. B2セルで選択された文字列とマッチする値を持っているセルをG列から検索してG列と同じ行のH列の値をJ列に書き出し
      3. J列の検索結果を書き出した範囲を、名前付き範囲として定義
      4. C2セルのドロップダウンリストの値に、J列の名前付き範囲をセット

      Worksheet.Changeイベントでドロップダウンリストの変更をキャッチする

      さて、B2セルのドロップダウンから値を選択したら、C2セルのドロップダウンリストに関連文字列だけ表示したい…ということは、B2セルのドロップダウンリストが変更されることが、C2セルのドロップダウンリストの文字列を変更させるトリガーになるわけですね。

      ならば、Worksheet.changeイベントで、ドロップダウンリストAがあるセルの値が変わったか?を見てあげればよさそうです

      イベントにコードを差し込む方法や、注意点についてはこちらの記事で紹介していますので、併せてご覧下さい。

      【エクセルVBA】イベントを使ってもっと便利なツールにしてみよう!WorksheetオブジェクトのChangeイベント
      エクセルのイベント、WorksheetオブジェクトのChangeイベントをご紹介しています。シートに対して、セルの入力や削除などがあった時の処理をこのイベントに仕込んでおけば、変更のアクション終了と同時に処理が実行されて便利ですよ!

      Worksheet.changeイベントは、引数Targetで変更があったセルをRange型で渡してくれるのでしたね。

      なので、こんな感じでB2セルの変更をキャッチしましょう。

      Private Sub Worksheet_Change(ByVal Target As Range)
      
      With ActiveSheet
          If Target = .Range("B2") Then   'ドロップダウンリストの文字列を選択したら 
          End If
      End With
      
      End Sub

      これでB2セルのドロップダウンリストが変更されたことを、VBAでキャッチできるようになりました。

      選択した文字列から検索した結果を書き出す

      お次はB2セルで選択した文字列をG列に持つセルと同じ行のH列にある文字列を検索しましょう。

      これは、FindとFindNextメソッドを使えば簡単。

      FindメソッドとFindNextメソッドの使い方は、下記の記事をご覧くださいね。

      【エクセルVBA】FindNextメソッドで指定範囲内の検索条件にヒットする値をすべて取得する方法
      Findextメソッドを使って、指定した範囲内で検索条件にヒットする値を全て取得する方法をご紹介しています。Findメソッドだけだと、指定範囲で一番最初に検索にヒットする値しか取得できませんが、FindNextメソッドなら複数の検索結果を取得できますよ。

      上のコードと組み合わせて、こんな風に記述できます。

      Dim myRange As Range
      Dim rngSearch As Range
      Dim i As Long
      Dim strAdr As String
      
      Set myRange = .Range("G2:G9")   'G列の検索範囲をセット
      Set rngSearch = myRange.Find(What:=.Range("B2"), LookAt:=xlPart)    'G列を検索
              
      Application.EnableEvents = False
      
      If Not rngSearch Is Nothing Then
          i = 2
      
          'ヒットした値をJ列に格納
          .Cells(i, 10).Value = .Cells(rngSearch.Row, 8).Value
      
          'ヒットした値のセルを退避
          strAdr = rngSearch.Address
      
          Do
              Set rngSearch = myRange.FindNext(rngSearch)
              If rngSearch Is Nothing Then
                  Exit Do
              Else
                  If strAdr <> rngSearch.Address Then
                      i = i + 1
                      .Cells(i, 10).Value = .Cells(rngSearch.Row, 8).Value
                  End If
              End If
          Loop While rngSearch.Address <> strAdr
      
      End If

      検索して見つかった文字列を文字列型の変数に格納して、それをドロップダウンリストの値としてセットする方法もありますが、前回記事でご紹介した通り、ドロップダウンリストにセットする文字数が255文字を超えると実行時エラーになってしまいます。

      なのでこの記事では、ドロップダウンリストにセットする文字列は名前付き範囲としてドロップダウンリストの値にセットしたいので、一旦J列に並べるようにしています。

      検索結果を名前付き範囲として定義する

      J列に書き出した検索結果を、名前付き範囲として定義してしまいましょう。

      こんな感じ。

      Dim rngResult   As String
      
      rngResult = "Sheet1!" & "$J$2:$J$" & i
      ActiveSheet.Names.Add Name:="検索結果", RefersTo:="=" & rngResult

      名前付き範囲をドロップダウンリストの値にセット

      最後に、名前付き範囲として定義した検索結果のセル範囲を、ドロップダウンリストにセットしましょう。

      ドロップダウンリストに値をセットするためには、ValidationオブジェクトのAddメソッドを使うのでしたね。

      なので、上のコードにこのメソッドを差し込みます。

      With .Range("C2").Validation
           .Delete
           .Add Type:=xlValidateList, _
           AlertStyle:=xlValidAlertStop, _
           Formula1:="=検索結果"
      End With

      このコードを実行してみると、作成されるドロップダウンリストの設定値に名前付き範囲がバッチリセットされます。

      複数のドロップダウンを連動させるコード

      この3ステップのコードを組み合わせると、こんなコードになります。

      Private Sub Worksheet_Change(ByVal Target As Range)
      Dim myRange As Range
      Dim rngSearch As Range
      Dim i As Long
      Dim strAdr As String
      Dim rngResult As String
      
      With ActiveSheet
      
          If Target = .Range("B2") Then   'ドロップダウンリストの文字列を選択したら
              Set myRange = .Range("G2:G9")   'G列の検索範囲をセット
      
              Set rngSearch = myRange.Find(What:=.Range("B2"), LookAt:=xlPart)    'G列を検索
              
              Application.EnableEvents = False
      
              If Not rngSearch Is Nothing Then
                  i = 2
      
                  'ヒットした値をJ列に格納
                  .Cells(i, 10).Value = .Cells(rngSearch.Row, 8).Value
      
                  'ヒットした値のセルを退避
                  strAdr = rngSearch.Address
      
                  Do
                      Set rngSearch = myRange.FindNext(rngSearch)
                      If rngSearch Is Nothing Then
                          Exit Do
                      Else
                           If strAdr <> rngSearch.Address Then
                              i = i + 1
                              .Cells(i, 10).Value = .Cells(rngSearch.Row, 8).Value
                          End If
                      End If
      
                  Loop While rngSearch.Address <> strAdr
      
                  '名前付き範囲の範囲更新
                  rngResult = "Sheet1!" & "$J$2:$J$" & i
                  
                  ActiveSheet.Names.Add Name:="検索結果", RefersTo:="=" & rngResult
      
              End If
      
              With .Range("C2").Validation
                  .Delete
                  .Add Type:=xlValidateList, _
                  AlertStyle:=xlValidAlertStop, _
                  Formula1:="=検索結果"
              End With
      
              Application.EnableEvents = True
      
              .Range("C2").Select
      
          End If
      
      End With
      
      End Sub
      そしてこのコードを実行してみると…
      validation,set,result

      この通り、B2セルのドロップダウンリストで選択した値に応じて、C2セルのドロップダウンリストに検索結果がセットされていますね。

      最後に

      今回は、VBAで複数のドロップダウンリストを連動させる方法をご紹介しました。

      ドロップダウンリストは、何かと便利なものですよね。

      複数のドロップダウンリストを組み合わせて使うことができれば、更に便利に使えそうです。

      それでは、最後までお読みいただきありがとうございました!

      備品購入申請フォームをGoogleフォームで作成する方法

      $
      0
      0

      みなさん、こんにちは!
      タカハシ(@ntakahashi0505)です。

      Google Apps Scriptを使って簡単なワークフローを作るシリーズです。

      備品購入申請のワークフローを考えていきます。

      さて、備品購入申請ですが、依頼する方はどういう方法で依頼するのが便利ですかね…?

      そう、Googleフォームですよね。

      ということで、今回は備品購入申請のフォームをGoogleフォームで作成していきます。

      今回は、びっくりするくらい簡単です。フォームを作るだけですので。

      では、行ってみましょう!

      備品購入申請のワークフローについて

      備品購入申請のワークフローについては以下のような流れで考えていきます。

      1. 申請者が欲しい備品についての情報を入力して申請
      2. 申請を承認者が確認して承認または否認
      3. 承認または否認の内容について備品購入担当者と申請者にメール

      これらをGoogleの各アプリケーションと、それを操作するGoogle Apps Scriptでシステム化していくわけですね!

      ワクワクしますね。

      Googleフォームでデータ入力をする理由

      Googleフォームで備品購入申請のフォームを作成していきますが、その前になぜGoogleフォームを使うかの理由についてお伝えします。

      Googleフォームで作成するメリットには以下のようなものがあります。

      • 入力する値に対する制限を簡単にかけられる(バリデーション)
      • フォームで受け取ったデータをスプレッドシートに蓄積できる
      • 「フォーム送信時」をトリガーとしてスクリプトを実行できる

      バリデーションというのは、例えばある質問は数値だけにしたいとか、日付だけにしたいとか、そういう入力値の制限をかけることです。

      スプレッドシートに直接入力だと、好きなデータ型を好きなように入力できてしまいますが、Googleフォームに入力してもらえれば、ある程度の制限をかけられますので、イレギュラーなデータが混在する可能性を減らすことができます。

      Googleフォームによる備品購入申請フォーム

      では、今回作成する備品購入申請フォームについてお見せしましょう。

      こちらです!

      Googleフォームによる備品購入申請

      各質問とその入力値、必須かどうか、回答の検証(バリデーション)については以下にまとめる通りです。

      質問 入力値 必須化どうか 回答の検証
      購買先 記述式 必須
      品名 記述式 必須
      単価 記述式 必須 数字のみ
      数量 記述式 必須 数字のみ
      Memo(URLなど) 段落

      フォームの設定について

      フォームを公開する前に、フォームの設定を確認しておきましょう。

      今回は、組織内の備品購入申請をイメージしています。

      ですから、以下図のように「設定」アイコンの「全般」タブについて

      • メールアドレスを収集する
      • *ドメイン名*と信頼できるドメインのユーザーに限定する

      の二つについてチェックを入れておきます。

      備品購入依頼フォームの設定

      メールアドレスは、上司が誰なのかを検索するキーとして、また結果を送信する先のアドレスとして使用しますね。

      回答先の選択

      フォームのデータを蓄積するスプレッドシートを「回答先の選択」から作成します。

      まずフォームの「回答」タブを開いて、スプレッドシートアイコンをクリックします。

      Googleフォームの回答タブからスプレッドシートアイコンをクリック

      「回答先の選択」ダイアログが開きますので、今回は「新しいスプレッドシートを作成」を選択して「作成」とします。

      Googleフォームの回答先となるスプレッドシートを作成

      すると、フォームが送信されたときにそのデータが蓄積される先であるスプレッドシートが作成され開きます。

      フォームの回答先のスプレッドシート

      シート名が「フォームの回答1」となっていることに注目しておいてください。

      もちろん「既存のスプレッドシートを選択」することもできますよ。

      備品購入申請フォームにテスト送信

      では、フォームの送信をテストしていきましょう。

      今は、フォームの編集画面を開いていると思いますので、上部の「プレビュー」アイコンをクリックして、プレビューしましょう。

      Googleフォームのプレビューを見る

      プレビューで実際にフォーム入力ができますので、適当に入力して送信しましょう。

      すると、先ほどのスプレッドシートに以下のように入力がされます。

      フォームから送信したデータをスプレッドシートで確認

      まとめ

      以上、Googleフォームで備品購入申請フォームを作る方法をお伝えしました。

      これまでであれば、ここで蓄積されたシートを上長や備品購入担当が時々チェックして、それぞれの作業をするかも知れません。

      ですが、我々にはGASがあります。

      その力を借りて、このフローを極力スピーディに、かつスマートにしていきたいと思います。

      次回はフォーム送信を受けてGmailを送信する方法をお伝えします。

      Google Apps Scriptでフォーム送信時にメッセージを送るスクリプトの作り方
      Google Apps Scriptで備品購入申請を題材にワークフローを作る方法をお伝えしております。今回はGASのトリガーという機能を使って、フォーム送信時にメッセージを送るスクリプトを作っていきます。

      どうぞお楽しみに!

      連載目次:初心者でも作れるGASによる簡単ワークフロー

      スプレッドシート、Gmail、フォーム…Google Apps Scriptで操作できるアプリケーションはまさに「ワークフロー」を作成する上で必要なものが揃っています。ということで、このシリーズでは初心者でも簡単に作れるワークフローの作り方について解説をしていきます。
      1. 備品購入申請フォームをGoogleフォームで作成する方法
      2. Google Apps Scriptでフォーム送信時にメッセージを送るスクリプトの作り方
      3. Google Apps Scriptでフォーム送信した内容を含んだメッセージをGmailで送るスクリプト
      4. Google Apps Scriptで特定のURLを踏んだらスクリプトを動作させるdoGet関数の使い方
      5. GASでURLを踏んでスクリプトを動作させたときにパラメータを渡す方法
      6. 【GASで作るワークフロー】URLクリックで「承認」とするスクリプトの作り方
      7. GASで送信するGmailのメッセージをプレーンでもHTMLでも送れるようにする
      8. GASのワークフローでURLのパラメータで承認・否認を切り替える方法
      Viewing all 2095 articles
      Browse latest View live


      <script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>