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

GASのダイアログでアップロードしたファイルをBlobオブジェクトとしてサーバー側に渡す方法

$
0
0
binary

photo credit: Clint__Budd Redundant Mug via photopin (license)

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

Google Apps Scriptでダイアログを使ったcsvファイルアップローダーを作成する方法をお伝えするシリーズです。

前回の記事はこちら。

GASのダイアログのデータをフォーム要素を渡すことでまとめてサーバー側に渡す方法
Google Apps Scriptでダイアログを使ったcsvファイルアップローダーを作成する方法をお伝えするシリーズです。今回は、GASのダイアログのデータをフォーム要素を渡すことでまとめてサーバー側に渡す方法です。

ダイアログのフォーム要素とそのデータをサーバー側に渡して取り出すことができました。

ただ、取り出したのがテキストデータでしたので、今回は「ファイル」を取り出していきたいと思います。

ということで、GASのダイアログでアップロードしたファイルをサーバー側に渡す方法です。

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

前回のおさらい

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

ダイアログを作成するHTMLファイル「dialog.html」はこちらです。


  
    
  
  
    

ここでのポイントは

  • type属性fileのinput要素と、type属性textのinput要素にname属性を付与したこと
  • button要素のonclick属性でサーバー側のlogTest関数を呼び出して、フォーム要素を渡すこと

ですね。

一方、サーバー側の「コード.gs」はコチラ。

function showDialog(){
  var html = HtmlService.createHtmlOutputFromFile('dialog');
  SpreadsheetApp.getUi().showModalDialog(html, "CSVアップロード");
}

function logTest(form){
  Logger.log('送信したテキストは %s', form.myText);
}

showDialog関数を実行すると、以下のようなダイアログが表示されます。

GASで作成したダイアログ

例えば、テキスト「テスト用のテキスト」を入力して、「アップロード」をクリックした後に、ログを確認すると、以下のようにテキストを取り出すことができます。

GASのダイアログで渡したフォーム要素からテキストを取り出す

今回は、いよいよアップロードしたファイルをサーバー側に渡してみますよ。

サーバーに渡されたファイルの型を調べる

さて、ダイアログから渡されたフォーム要素から、type属性fileのinput要素が持つファイルデータを取り出すには、そのname属性を使って

form.myFile

とすれば良さそうな気がします。

ただ、myTextは文字列でしたが、myFileは…?

ちょっと調べてみましょう。

ファイルはどのような型でサーバー側に渡されるのでしょうか?

「コード.gs」のlogText関数を以下のように変更して検証してみましょう。

function logTest(form){
  Logger.log(typeof form.myFile)
  Logger.log(typeof form.myText)
}

typeof演算子は与えた値の型を調べるものですね。

typeof

以下のように、ファイルを選択で「onigiri.csv」というcsvファイルを、テキストボックスに「テキスト」を入力して「アップロード」をクリックします。

GASのダイアログでファイルとテキストを渡す

ログを確認すると、以下のように表示されます。

GASのダイアログで渡したデータの型を調べる

テキストは「string」、ファイルは「object」ですね…

ファイルを取り扱うBlobオブジェクト

答えをバラしてしまうと、GASで「ファイルをやり取りする場合」は、Blobオブジェクトというオブジェクトで取り扱います。

Blobというのは「Binary Large OBject」の略です。

csvファイルはテキストファイルなので、バイナリファイルではないのですが、GASではどちらも一緒くたにBlobオブジェクトとして取り扱います。

ということで、「コード.gs」のlogTest関数を以下のように変更してみました。

function logTest(form){
  var blob = form.myFile;
  Logger.log('%sをアップロードしました', blob.getName());
}

BlobオブジェクトのgetNameメソッドは、その名の通り、Blobオブジェクトすなわちファイル名を取得するメソッドですね。

Blobオブジェクト.getName()

ダイアログからファイルを渡す動作確認

では、こちらに変更して、ダイアログからファイルを渡す動作確認をしてみましょう。

実行結果がコチラ。

GASのダイアログで渡したデータの型を調べる

バッチリですね!

まとめ

以上、GASのダイアログでアップロードしたファイルをサーバー側に渡す方法をお伝えしました。

今回は、GASでファイルを受け渡しするときに使用するBlobオブジェクトについて覚えていただければOKですね。

次回、csvファイルをスプレッドシートに展開していきますよ。

どうぞお楽しみに!

連載目次:GASのダイアログでcsvファイルアップローダーを作ろう

Google Apps Scriptでダイアログを作成する方法はいくつかありますが、HTMLサービスとUiサービスを組み合わせると自由で多機能なダイアログが作れます。このシリーズではそんなダイアログの作り方を易しく紹介していきます。
  1. Google Apps Scriptでダイアログを作るいくつかの方法と基礎知識
  2. GASで最も簡単なHTMLサービスによるダイアログを作成する方法
  3. GASのダイアログで作成するファイルアップローダーの部品を配置する方法
  4. GASのダイアログでボタンをクリックしてアラート表示を動作させる方法
  5. GASのダイアログのボタンクリックでサーバー側の関数を呼び出すgoogle.scripot.run
  6. GASのダイアログのデータをフォーム要素を渡すことでまとめてサーバー側に渡す方法

Google Apps ScriptでCSVファイルのデータをスプレッドシートに展開する方法

$
0
0
parse

photo credit: Ano Lobb. @healthyrx Pomegranate palm via photopin (license)

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

Google Apps Scriptでダイアログを使ったcsvファイルアップローダーを作成する方法をお伝えするシリーズです。

前回の記事はこちら。

GASのダイアログでアップロードしたファイルをBlobオブジェクトとしてサーバー側に渡す方法
Google Apps Scriptでダイアログを使ったcsvファイルアップローダーを作成する方法をお伝えするシリーズです。今回は、GASのダイアログでアップロードしたファイルをサーバー側に渡す方法です。

ダイアログでアップロードしたファイルをサーバー側に渡すことができました。

今回は、GASでCSVファイルをスプレッドシートに展開する方法です。

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

前回のおさらい

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

ダイアログを作成するためのHTMLファイル「dialog.html」は以下のとおりです。


  
    
  
  
    

(前回はテキストボックスのinput要素もありましたが、もう必要ないので削除してます。)

そして、サーバー側の「コード.gs」はこちらです。

function showDialog(){
  var html = HtmlService.createHtmlOutputFromFile('dialog');
  SpreadsheetApp.getUi().showModalDialog(html, "CSVアップロード");
}

function logTest(form){
  var blob = form.myFile;
  Logger.log('%sをアップロードしました', blob.getName());
}

showDialog関数を実行すると以下のようなダイアログが表示されます。

GASで作成するファイルアップローダーダイアログ

「ファイルを選択」から「onigiri.csv」をアップロードして、「アップロード」ボタンをクリックすると、サーバー側のlogTest関数にフォーム要素が渡されます。

ログを確認すると、以下のようにフォーム要素から取り出したファイルのファイル名が表示されていることを確認できます。

GASのダイアログで渡したデータの型を調べる

今回は、この渡したCSVファイルをスプレッドシートに展開していきますよ。

CSVファイルをスプレッドシートに展開する

CSVファイルをスプレッドシートに展開するにはどうしたら良いでしょうか?

手順としては以下となります。

  1. BlobオブジェクトからCSV文字列を取り出す
  2. CSV文字列を解析して二次元配列化する
  3. 二次元配列をスプレッドシートに展開する

BlobオブジェクトからCSV文字列を取り出す

CSVファイルはBlobオブジェクトとして変数blobに格納されています。

CSVファイルは、テキストファイルですから、文字列として取り出すことができます。

Blobオブジェクトから文字列を取り出すのが、getDataAsStringメソッドです。

Blobオブジェクト.getDataAsString()

以下のようにすることで、CSVファイルからテキストを取り出して、変数csvTextに格納することができます。

var blob = form.myFile;
var csvText = blob.getDataAsString();

CSVテキストを二次元配列に変換する

CSVテキストはただの文字列ですから、スプレッドシートに貼り付けると、ひとつのセルに入ってしまいそうです。

二次元配列だったら、そのままsetValuesメソッドでスプレッドシートに展開できるのですが…

そんなときに便利なのが、UtilitiesサービスのparseCsvメソッドです。

parseCsvメソッドは、引数として与えたCSVテキストを解析して、二次元配列に変換するメソッドです。

Utilities.parseCsv(CSVテキスト)

以下のようにすれば、CSVテキストcsvTextが、二次元配列に変換されてvaluesに格納されます。

var values = Utilities.parseCsv(csvText)

CSVファイルの展開を動作確認する

こうして出来上がったのが、以下のuploadCsv関数です。

function uploadCsv(form) {  
  var blob = form.myFile;
  var csvText = blob.getDataAsString();    
  var values = Utilities.parseCsv(csvText);
  SpreadsheetApp.getActiveSheet().getRange(1, 1, values.length, values[0].length).setValues(values);
}

ボタンクリックとgoogle.script.runで呼び出される関数を上記uploadCsv関数に変更して、CSVファイルの展開を動作確認しましょう。

ダイアログに「onigiri.csv」をアップロードして、「アップロード」をクリックすると以下のようにスプレッドシートに展開されます。

GASでCSVファイルをスプレッドシートに展開

きちんと展開されていますね!

ただ、ダイアログが表示されっぱなしなので、少し邪魔ではありますが…

まとめ

以上、GASでCSVファイルをスプレッドシートに展開する方法をお伝えしました。

難しそう…と思いきや、parseCsvメソッドのおかげで案外サクっと実装できましたね。

次回は、アップロードが完了したらダイアログを消すように変更していきます。

どうぞお楽しみに!

連載目次:GASのダイアログでcsvファイルアップローダーを作ろう

Google Apps Scriptでダイアログを作成する方法はいくつかありますが、HTMLサービスとUiサービスを組み合わせると自由で多機能なダイアログが作れます。このシリーズではそんなダイアログの作り方を易しく紹介していきます。
  1. Google Apps Scriptでダイアログを作るいくつかの方法と基礎知識
  2. GASで最も簡単なHTMLサービスによるダイアログを作成する方法
  3. GASのダイアログで作成するファイルアップローダーの部品を配置する方法
  4. GASのダイアログでボタンをクリックしてアラート表示を動作させる方法
  5. GASのダイアログのボタンクリックでサーバー側の関数を呼び出すgoogle.scripot.run
  6. GASのダイアログのデータをフォーム要素を渡すことでまとめてサーバー側に渡す方法
  7. GASのダイアログでアップロードしたファイルをBlobオブジェクトとしてサーバー側に渡す方法

【エクセルVBA】AfterUpdateイベントでテキストボックス同士を連動させてみよう

$
0
0

テキストボックス,afterupdate

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

エクセルのユーザーフォームを作って、使ってみるまでを目標に、各コントロールやプロパティ、イベントなどを連載記事でご紹介しています。

前回は、Initializeイベントで、ユーザーフォームを開いたら、ワークシートの値をユーザーフォーム上のテキストボックスに表示する方法をご紹介しました。

【エクセルVBA】Initializeイベントでワークシートの値をユーザーフォームの初期値にセットする
ユーザーフォームを作って使ってみることを目標に、連載記事でプロパティやイベントなどをご紹介しています。今回は、ユーザーフォームのInitializeイベントを使って、ワークシート上のセルの値を、ユーザーフォームを開いたときの初期値にセットする方法をご紹介しています。

今回は、テキストボックスに入力した値をワークシートから検索して、関連する値を別のテキストボックスに表示する方法をご紹介していきます!

前回までのおさらい

前回までに作成したユーザーフォームがこちら。

オブジェクト取得,オブジェクト名

今回は、フォーム上にあるふたつのテキストボックスを連動させていきますよ。

Valueプロパティでテキストボックスの値を操作する

テキストボックスの値は、前回記事でご紹介した通り、Valueプロパティで操作できるのでしたね。

別々のテキストボックスを操作するといっても、Valueプロパティにセットされた値を使って、別のテキストボックスのValueプロパティに値をセットするだけと考えれば、難しく考えることはありません。

ただふたつのテキストボックスのValueプロパティの値を操作すればよいだけなのです。

テキストボックスに入力した値からテーブルの値を検索する

今回は、こちらのテーブルを使って、値の検索をしてみます。

テキストボックス,検索用テーブル

ユーザーフォーム上の「品目」のテキストボックスに、テーブルの「品目」にある値を入力すれば、入力値をテーブルから検索して、マッチするレコードの「生産地」の値を、ユーザーフォーム上の「生産地」のテキストボックスに表示させる、というのが今回の趣旨です。

検索用のコードを作る

早速、テキストボックスに入力した値をワークシートから検するコードを作っていきましょう。

ワークシート上から特定の値を検索する方法は、以前の記事でお伝えした方法が使えます。

【エクセルVBA】指定した範囲内から値を検索するFindメソッドとその使い方
エクセルシートに入力した値から、VBAのFindメソッドを使ってシート内を検索し、結果を返す方法をご紹介しています。Findメソッドは部分一致or全体一致、列方向or行方向など検索の条件を色々指定できて使い勝手が良いのでオススメですよ。

検索結果は、表示したいテキストボックスのValueプロパティにセットするだけでokです。

検索の結果取得できた値を、「生産地」のテキストボックスにセットしてみましょう。

テキストボックス 「生産地」には、「TextRegion」というオブジェクト名をつけてありますので、こんなコードになります。

Dim myRange As Range
Dim rngSearch As Range

Set myRange = ActiveSheet.Range("A1:B7")
Set rngSearch = myRange.Find(What:=TextItem.Value, LookAt:=xlPart)

If Not rngSearch Is Nothing Then

    'ヒットした値を生産地テキストボックスにセット
    TextRegion.Value = ActiveSheet.Cells(rngSearch.Row, rngSearch.Column + 1).Value
End If

検索に使うイベント

さて、上で作成したコードを、テキストボックスのイベントプロシージャ内に差し込んでいきましょう。

テキストボックスのイベントは、以前の記事でいくつかお伝えしました。

【エクセルVBA】テキストボックスでよく使う3つのイベントを使ってみよう
ユーザーフォームを作成して、使ってみるところまでを連載形式でご紹介しています。今回は、テキストボックスのEnter,Exit,Changeの3つのイベントをご紹介していますよ。イベントは各コントロールに数多く用意されていますが、各イベントの実行タイミングとできることを知って、便利に使ってしまいましょう!

今回はテキストボックスに入力された値を使いたいので、以前の記事の中でご紹介したイベントだと、ChangeイベントかExitイベントが使えそう、と思いますよね。

しかし、Changeイベントはテキストボックスに1文字入力される度に実行されてしまいますし、Exitイベントは、テキストボックスに入力した値で検索をしたいのに、そのテキストボックスからフォーカスを外さないと実行されません。

検索には不向きですよね。

AfterUpdateイベントで値を検索する

そこで今回は、テキストボックスのAfterUpdateイベントを使ってみましょう。

AfterUpdateイベントは、テキストボックスの値が変更されたあとテキストボックスからフォーカスが外れると実行されるイベントです。

Exitイベントとの違い

テキストボックスからフォーカスが離れる時に実行されるなら、AfterUpdateイベントとExitイベントは同じじゃないの?と思われるかもしれません。

Exitイベントの場合、テキストボックスからフォーカスが外れて、別のコントロールにフォーカスが移動する場合に実行されます。

一方、AfterUpdateイベントは、テキストボックスのValueプロパティの値が変更されて、フォーカスがテキストボックスから離れる時に実行されます。

Exitイベントは、Valueプロパティが変更されたかどうかは関係なく実行されることになりますね。

AfterUpdateイベントで検索した値を別のテキストボックスに表示する

それでは、上でご紹介した検索のコードを、AfterUpdateイベントのイベントプロシージャに差し込んでみましょう。

コードの全体はこのようになります。

Private Sub TextItem_AfterUpdate()
Dim myRange As Range
Dim rngSearch As Range

Set myRange = ActiveSheet.Range("A1:B7")
Set rngSearch = myRange.Find(What:=TextItem.Value, LookAt:=xlPart)

If Not rngSearch Is Nothing Then

    'ヒットした値を生産地テキストボックスにセット
    TextRegion.Value = ActiveSheet.Cells(rngSearch.Row, rngSearch.Column + 1).Value

End If

End Sub

早速、テキストボックスで検索したい値を入力してみましょう。

テキストボックス,検索値

このように、「品目」のテキストボックスに「さくらんぼ」と入力して、Enterキーを押すと…

テキストボックス,検索結果

この通り、下のテキストボックスに、「山形」が表示されましたね。

最後に

今回は、AfterUpdateイベントで、ふたつのテキストボックスの値を連動させる方法をご紹介しました。

今回の方法は、例えばマスタの管理画面で商品コードを入力すると、マスタ上で紐付いている商品名を別のテキストボックスに表示する、といった、マスタ管理や検索画面などで使える方法ですよ。

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

GASのダイアログをファイルをアップロードが成功したら閉じる方法

$
0
0

close

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

Google Apps Scriptでダイアログを使ったcsvファイルアップローダーを作成する方法をお伝えするシリーズです。

前回の記事はこちら。

Google Apps ScriptでCSVファイルのデータをスプレッドシートに展開する方法
Google Apps Scriptでダイアログを使ったcsvファイルアップローダーを作成する方法をお伝えするシリーズです。今回は、GASでCSVファイルをスプレッドシートに展開する方法です。

ダイアログから渡したCSVファイルをスプレッドシートに展開する方法をお伝えしました。

これで完成!…と思いきや、アップロードした後にダイアログが表示しっぱなし…という問題があったんですね。

今回は、それを解消していきましょう。

ということで、GASのダイアログをファイルをアップロードが成功したら閉じる方法です。

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

前回のおさらい

では、これまでのおさらいです。

ダイアログを作成する「dialog.html」はこちら。


  
    
  
  
    

「アップロード」ボタンをクリックすると、サーバー側のuploadCsv関数をフォーム要素を渡しつつ呼び出します。

一方で、サーバー側の「コード.gs」がこちら。

function showDialog(){
  var html = HtmlService.createHtmlOutputFromFile('dialog');
  SpreadsheetApp.getUi().showModalDialog(html, "CSVアップロード");
}

function uploadCsv(form) {  
  var blob = form.myFile;
  var csvText = blob.getDataAsString();    
  var values = Utilities.parseCsv(csvText);
  SpreadsheetApp.getActiveSheet().getRange(1, 1, values.length, values[0].length).setValues(values);
}

showDialog関数がダイアログを表示する関数、uploadCsv関数がクライアント側から呼び出されて

  1. 受け取ったフォーム要素からCSVファイルを取り出し
  2. CSVファイルからCSVテキストを取り出し
  3. CSVテキストを二次元配列化し
  4. 二次元配列をスプレッドシートに展開する

というものでした。

ただ、ファイルを「アップロード」すると、スプレッドシートへの展開はうまくいくのですが、ダイアログが閉じてくれない…

GASでCSVファイルをスプレッドシートに展開

その点を解消するのが今回のミッションです。

サーバー側の処理が完了したらダイアログを閉じる

さて、どうやってそのサーバー側の処理が完了したらダイアログを閉じるというミッションをクリアするかですが

  1. アップロードが完了したら、それを受けて
  2. ダイアログを閉じる

という処理をすればよいわけですよね。

サーバー側の関数の呼び出し成功で関数を実行する

まず前者ですが、今回の場合は「updateCsv関数の呼び出しが無事に完了したら」ともいいかえることができます。

そのようなときに使用するのが、google.script.runのwithSuccessHandlerメソッドです。

以下のように記述して、「関数名」で指定したサーバー側の関数の呼び出しが無事に完了したら、引数に指定した「コールバック関数」を実行します。

google.script.run.withSuccessHandler(コールバック関数).関数名(引数1, 引数2,…)

ですから、今回のケースでは、「dialog.html」のbutton要素のonclick属性に仕込むスクリプトを以下のようにすればよいわけです。

google.script.run.withSuccessHandler(function(){
  //何か処理
}).uploadCsv(form);

クライアント側からダイアログを閉じる

withSuccessHandlerメソッドの引数内に記述する関数内の「何か処理」でダイアログを閉じる処理を入れます。

ですが、このスクリプト…クライアント側で動作するhtmlファイル内ですよね?

クライアント側からダイアログの操作って…できるんでしょうか?

って、できるんです!

google.script.hostというものを使うと、ダイアログやサイドバーを操作することができるんです。

そして、それらを閉じる命令としてcloseメソッドが用意されています。

google.script.host.close()

これを使って、以下のようにすればファイルアップロード後にダイアログが閉じるはず…!

google.script.run.withSuccessHandler(function(){
  google.script.host.close();
}).uploadCsv(form);

scriptタグにJavaScriptを記述する

さて、button要素のonclick属性に記述する処理がだいぶ増えてしまったので、ダブルクォーテーション内に書くのは、だいぶしんどいですね。

なので、関数化して外出ししましょう。

HTMLファイル内のJavaScriptはscriptタグ内に記述することができます。

<script>
 // スクリプト
</script>

ですから、今回の場合は以下のようにscriptタグ内の関数uploadCsvにまとめます。


  
    
  
  
    

button要素のonclick属性にuploadCsv関数の呼び出しを入れればよいわけですね。

ダイアログを閉じる動作確認

では、ダイアログを閉じる動作確認をしましょう。

ダイアログを表示して、CSVファイルをアップロードすると…

GASのダイアログからCSVを展開してダイアログを閉じた

ちゃんとダイアログが閉じました!

まとめ

以上、GASのダイアログをファイルをアップロードが成功したら閉じる方法をお伝えしました。

google.script.runのwithSuccessHandlerメソッドと、google.script.hostのcloseメソッドですね。

クライアント側でできることもいくつかあるんですね。

次回は、ファイルアップロードが失敗したときについて考えていきます。

どうぞお楽しみに!

連載目次:GASのダイアログでcsvファイルアップローダーを作ろう

Google Apps Scriptでダイアログを作成する方法はいくつかありますが、HTMLサービスとUiサービスを組み合わせると自由で多機能なダイアログが作れます。このシリーズではそんなダイアログの作り方を易しく紹介していきます。
  1. Google Apps Scriptでダイアログを作るいくつかの方法と基礎知識
  2. GASで最も簡単なHTMLサービスによるダイアログを作成する方法
  3. GASのダイアログで作成するファイルアップローダーの部品を配置する方法
  4. GASのダイアログでボタンをクリックしてアラート表示を動作させる方法
  5. GASのダイアログのボタンクリックでサーバー側の関数を呼び出すgoogle.scripot.run
  6. GASのダイアログのデータをフォーム要素を渡すことでまとめてサーバー側に渡す方法
  7. GASのダイアログでアップロードしたファイルをBlobオブジェクトとしてサーバー側に渡す方法
  8. Google Apps ScriptでCSVファイルのデータをスプレッドシートに展開する方法

GASのダイアログでファイルアップロードが失敗したらアラートを表示する方法

$
0
0
failure

photo credit: Crawford Brian 3 Carts via photopin (license)

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

Google Apps Scriptでダイアログを使ったcsvファイルアップローダーを作成する方法をお伝えするシリーズです。

前回の記事はこちら。

GASのダイアログをファイルをアップロードが成功したら閉じる方法
Google Apps Scriptでダイアログを使ったcsvファイルアップローダーを作成する方法をお伝えするシリーズです。今回は、GASのダイアログをファイルをアップロードが成功したら閉じる方法です。

ファイルアップロードが完了したらダイアログ自身を閉じる方法をお伝えしました。

ただ、ファイルを選択せずに「アップロード」したとき、アップロードは失敗するはずなのですが、どうなるんでしょうか…?

ということで、今回はGASのダイアログでファイルアップロードが失敗したらアラートを表示する方法をお伝えします。

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

前回のおさらい

では、前回のコードのおさらいです。

以下がダイアログを作成するHTMLファイル「dialog.html」です。


  
    
  
  
    

ポイントはscriptタグの中の、uploadCsv関数。

サーバー側の同名のuploadCsv関数を呼びつつ、その呼び出しが無事に完了したらgoogle.script.run.closeメソッドでダイアログ自身を閉じるというというものです。

サーバー側の「コード.gs」は以下のとおりです。

function showDialog(){
  var html = HtmlService.createHtmlOutputFromFile('dialog');
  SpreadsheetApp.getUi().showModalDialog(html, "CSVアップロード");
}

function uploadCsv(form) {  
  var blob = form.myFile;
  var csvText = blob.getDataAsString();    
  var values = Utilities.parseCsv(csvText);
  SpreadsheetApp.getActiveSheet().getRange(1, 1, values.length, values[0].length).setValues(values);
}

showDialog関数を実行すると以下のダイアログを表示します。

GASで作成するファイルアップローダーダイアログ

ダイアログの「ファイルを選択」からアップロードするCSVファイルを選び、「アップロード」することで、スプレッドシートにCSVの内容を展開します。

ファイルアプロードが失敗したときの処理

例えば、「ファイルを選択」で何のファイルも選択しなかった場合、「アップロード」ボタンをクリックすると、どうなるでしょうか?

やってみると…上記画面のまま何も起きません。

スクリプトエディタで「表示」→「実行トランスクリプト」で、スクリプトの実行のようすを確認すると…

GASの実行トランスクリプトでエラーを確認

以下のようなエラーが発生していることが確認できました。

実行に失敗: TypeError: undefined からプロパティ「length」を読み取れません。

ただ、ダイアログを操作しているユーザーには、このようなエラーが起きていることがわからないんですね。

ということで、エラーが起きたときに、それをユーザーにお知らせするように変更をしていきたいと思います。

サーバー側の呼び出しが失敗したら関数を実行する

前回の記事で、サーバー側の関数呼び出しが成功したら指定した関数を実行する、google.script.runのwithSuccessHandlerメソッドを紹介しました。

それに対して、サーバー側の関数呼び出しが失敗したら指定した関数を実行する、withFailureHandlerメソッドが存在しています。

書式はこちらです。

google.script.run.withFailureHandler(コールバック関数).関数名(引数1, 引数2,…)

それで、withSuccessHandlerメソッドも、withFailureHandlerメソッドも、ともにgoogle.script.runオブジェクトを返しますので、以下のように連続してつなげて記述が可能です。

google.script.run.withSuccessHandler(function(){
  //成功したときの処理
}).withFailureHandler(function(){
  //失敗したときの処理
}).uploadCsv(form);

エラーが発生したらアラートを表示する

ですから、「dialog.html」のscriptタグ内のuploadCsv関数を以下のように変更すれば、エラーのときにユーザーにアラートを表示するようになります。


  
    
  
  
    

では、動作確認をしてみましょう。

ファイルを選択せずに「アップロード」ボタンをクリックすると…

GASのダイアログでファイルアップロード失敗時にアラートを出す

アラートの表示を確認できます。

まとめ

以上、GASのダイアログでファイルアップロードが失敗したらアラートを表示する方法をお伝えしました。

withSuccessHandlerメソッドとwithFailureHandlerメソッドはセットで覚えちゃうとよいですね。

これにて、CSVファイルアップロードダイアログの作り方はシリーズ完了となります。

使いどころはそこそこあると思いますので、どうぞご活用くださいませ。

また、便利なツールを思いついたら紹介しますね。

どうぞお楽しみに!

連載目次:GASのダイアログでcsvファイルアップローダーを作ろう

Google Apps Scriptでダイアログを作成する方法はいくつかありますが、HTMLサービスとUiサービスを組み合わせると自由で多機能なダイアログが作れます。このシリーズではそんなダイアログの作り方を易しく紹介していきます。
  1. Google Apps Scriptでダイアログを作るいくつかの方法と基礎知識
  2. GASで最も簡単なHTMLサービスによるダイアログを作成する方法
  3. GASのダイアログで作成するファイルアップローダーの部品を配置する方法
  4. GASのダイアログでボタンをクリックしてアラート表示を動作させる方法
  5. GASのダイアログのボタンクリックでサーバー側の関数を呼び出すgoogle.scripot.run
  6. GASのダイアログのデータをフォーム要素を渡すことでまとめてサーバー側に渡す方法
  7. GASのダイアログでアップロードしたファイルをBlobオブジェクトとしてサーバー側に渡す方法
  8. Google Apps ScriptでCSVファイルのデータをスプレッドシートに展開する方法

【エクセルVBA】コマンドボタンのClickイベントでワークシートを更新してみよう

$
0
0

 

ユーザーフォーム,ワークシート更新皆様こんにちは、ノグチです。

エクセルのユーザーフォームを作って、使ってみるまでを目標に、連載記事でご紹介しています。

前回の記事では、テキストボックスに入力した値からワークシートを検索して、関連する値をユーザーフォーム上の別のテキストボックスに表示させる方法をご紹介しました。

【エクセルVBA】AfterUpdateイベントでテキストボックス同士を連動させてみよう
エクセルユーザーフォーム上の複数のテキストボックスを、AfterUpdateイベント内で連動させる方法をご紹介しています。テキストボックスに入力された値から、ワークシート上のリストを検索して、検索結果を別のテキストボックスに表示させるという、マスタ管理画面や、検索画面などで使える方法です。

今回は、ユーザーフォームのコマンドボタンを押したときワークシートの値をテキストボックスに入力されている値で更新する方法をご紹介します!

前回までのおさらい

これまでに作成したユーザーフォームがこちら。

ユーザーフォーム,オブジェクト名

MyFormというフォーム上に、「品名」「生産地」とラベルを付けたテキストボックス2つと、コマンドボタンを1つ配置しています。

テキストボックスの「品目」「生産地」には、それぞれTextItem、TextRegionというオブジェクト名と、コマンドボタンにはbtnOKというオブジェクト名をつけてあります。

前回はテキストボックスのAfterUpdateイベントで、「品目」に入力された値をワークシートの「品目」列から検索して、ヒットすれば「生産地」の値を取得してユーザーフォームの「生産地」テキストボックスに表示させたのでした。

前回のワークシート上のリストがこちら。

テキストボックス,検索用テーブル

そして、検索用のコードがこちらでした。

Private Sub TextItem_AfterUpdate()
Dim myRange As Range
Dim rngSearch As Range

Set myRange = ActiveSheet.Range("A1:B7")
Set rngSearch = myRange.Find(What:=TextItem.Value, LookAt:=xlPart)

If Not rngSearch Is Nothing Then
    'ヒットした値を生産地テキストボックスにセット
    TextRegion.Value = ActiveSheet.Cells(rngSearch.Row, rngSearch.Column + 1).Value
End If

End Sub

今回は、こちらのコードに手を加えて、ユーザーフォーム上のコマンドボタンをクリックしたときに、
  1. ワークシートのリスト上に存在している値がテキストボックス「品名」に入力されていて、「生産地」の値がリストとテキストボックスで異なる場合、テキストボックスの値でワークシートを更新する
  2. テキストボックス「品名」に入力された値が、ワークシートのリスト上に存在していなかった場合、テキストボックス「品名」「生産地」の値をワークシートのリスト最下行に追加する
  3. ワークシートに変更があったら、ブックを保存する

の3つの処理をさせてみましょう。

テキストボックスの入力値でワークシートを更新する

まずは、テキストボックス「品名」の値がワークシートのリスト上に存在していた場合です。

コードの中でやるべきことは、

  1. 「品名」に入力された値がワークシートのリストの何行目にあるかを検索
  2. ヒットした「品名」と同じ行の、隣の列にあるセルの値を、テキストボックス「生産地」の入力値で更新
  3. ブックを保存

の3ステップです。

前回のコードにこの3ステップを加えて、コマンドボタンのClickイベントに差し込むと、こんな感じになります。

Private Sub btnOK_Click()
Dim myRange As Range
Dim rngSearch As Range

With ActiveSheet
    Set myRange = .Range(.Cells(1, 1), .Cells(.Range("A1").End(xlDown).Row, 2))

    'テキストボックスの入力値から、ワークシート更新対象の行を検索
    Set rngSearch = myRange.Find(What:=TextItem.Value, LookAt:=xlPart)

    If Not rngSearch Is Nothing Then

        'テキストボックスに入力した値とワークシートのリストの値が異なっていた場合、ワークシートを更新
        If TextRegion.Value <> .Cells(rngSearch.Row, rngSearch.Columns(2).Column).Value Then
            .Cells(rngSearch.Row, rngSearch.Columns(2).Column).Value = TextRegion.Value
        End If
    End If

End With

ThisWorkbook.Save
End Sub

早速こちらのコードを実行してみましょう。

まず、ユーザーフォームのテキストボックス「品名」に「りんご」を入力します。

ユーザーフォーム,品名,りんご

ワークシートのリスト上から、「りんご」と紐付いた「長野」という「生産地」の値がテキストボックス「生産地」に表示されました。

テキストボックス、品名、変更、りんご

ではテキストボックス「生産地」の値を変更して、コマンドボタンをクリックすると…

テキストボックス,ワークシート更新,りんご
この通り、テキストボックスに入力した値でワークシートが更新されましたね!

新しいレコードをワークシートに追加する

ここまでで、既存の「品名」と紐づいた「生産地」を更新することができました。

今度は、新しい「品名」がテキストボックスに入力された場合、ワークシートの最下行に追加する方法を考えてみましょう。

コードの中で必要な処理は、
  1. 「品名」に入力された値がワークシートに存在するか検索
  2. 存在していなかった場合、ワークシートのリスト最下行に、テキストボックス「品名」「生産地」の値を追加
  3. ブックを保存

の3ステップに整理できそうです。

ステップ1の、「「品名」に入力された値がワークシートに存在するか検索」については、7行目のrngSearchでやってくれていますね。

また、ステップ3の「ブックを保存」についてもやってくれていますので、ステップ2だけ考えれば良さそうです。

テキストボックスに入力した「品名」がワークシートに存在するかどうかチェックする方法については、「品名」がワークシート上に存在しない場合、rngSearchにはNothingが返ってくるはずです。

なので、9行目にあるIF文に、分岐を加えればいいですね。

rngSearchにNothingが返された場合、ワークシートのリストの最下行にテキストボックスの値を追加する処理を加えると、こんな感じのコードになります。

   'テキストボックスの入力値から、ワークシート更新対象の行を検索
        Set rngSearch = myRange.Find(What:=TextItem.Value, LookAt:=xlPart)

        If Not rngSearch Is Nothing Then

            'テキストボックスに入力した値とワークシートのリストの値が異なっていた場合、ワークシートを更新
            If TextRegion.Value <> .Cells(rngSearch.Row, rngSearch.Columns(2).Column).Value Then
                .Cells(rngSearch.Row, rngSearch.Columns(2).Column).Value = TextRegion.Value
            End If
        Else
            'ワークシートに新規追加
            .Cells(myRange.Rows.Count + 1, myRange.Columns(1).Column).Value = TextItem.Value
            .Cells(myRange.Rows.Count + 1, myRange.Columns(2).Column).Value = TextRegion.Value
        End If

ワークシートが更新された場合のみブックを保存する

ワークシートに新しい「品名」と「生産地」を追加する処理のコードができたところで、あとは「テキストボックスの入力値でワークシートを更新する」の項で登場するコードと合体させれば完成ですが、もうひと手間加えましょう。

このまま単純に合体させただけのコードでは、ワークシートが更新されていなくてもブックの保存が実行されてしまいます。

ブックの保存はワークシートが更新された場合のみ実行したいので、ワークシートが更新されたことを検知するフラグを使って、更新されたかどうかをチェックできるようにしておきます。

コードの全体は、こんな感じになります。

Private Sub btnOK_Click()

Dim myRange As Range
Dim rngSearch As Range
Dim blnChange As Boolean    'ワークシート変更フラグ

blnChange = False

If TextItem.Value <> "" Then

    With ActiveSheet
        Set myRange = .Range(.Cells(1, 1), .Cells(.Range("A1").End(xlDown).Row, 2))

        'テキストボックスの入力値から、ワークシート更新対象の行を検索
        Set rngSearch = myRange.Find(What:=TextItem.Value, LookAt:=xlPart)

        If Not rngSearch Is Nothing Then


            'テキストボックスに入力した値とワークシートのリストの値が異なっていた場合、ワークシートを更新
            If TextRegion.Value <> .Cells(rngSearch.Row, rngSearch.Column + 1).Value Then
                .Cells(rngSearch.Row, rngSearch.Column + 1).Value = TextRegion.Value
            End If
        Else
            'ワークシートに新規追加
            .Cells(myRange.Rows.Count + 1, myRange.Columns(1).Column).Value = TextItem.Value
            .Cells(myRange.Rows.Count + 1, myRange.Columns(2).Column).Value = TextRegion.Value
        End If

    End With
End If

If blnChange = True Then
    'ワークシートが更新された場合のみブックを保存する
    ThisWorkbook.Save
End If

End Sub

テキストボックスに入力した値をワークシートのリストに追加

では早速、上のコードを動かしてみましょう。

ユーザーフォームを開いて、ワークシートのリスト上に存在していない「品名」を入力して、「生産地」にも値を入力します。

ユーザーフォーム,新規,ドリアン

そしてコマンドボタンを押すと…

ユーザーフォーム,ワークシートに追加,ドリアン

この通り、ワークシート上のリスト最下行に、テキストボックスに入力した値が追加されていますね!

最後に

今回は、ユーザーフォームのテキストボックスに入力された値で、ワークシートのリストを更新する方法をご紹介しました。
今回ご紹介した方法は、ユーザーフォームでマスタ登録や変更をしたい場合に使えますよ。
それでは、最後までお読みいただきありがとうございました!

連載目次:【エクセルVBA】ユーザーフォームを使ってみよう!

ユーザーフォームは、ちょっとした画面なら作れてしまう、便利な機能です。

何となく敷居が高いように感じてしまいますが、順を追っていけば難しいことはありませんよ。

  1. 【エクセルVBA】ユーザーフォームを作ってみよう!VBEでフォームを挿入する方法
  2. 【エクセルVBA】Showメソッドでユーザーフォームをコマンドボタンから開いてみよう!
  3. 【エクセルVBA】コマンドボタンのClickイベントとUnloadステートメントでユーザーフォームを閉じる方法
  4. 【エクセルVBA】テキストボックスのプロパティで入力を便利にしよう
  5. 【エクセルVBA】テキストボックスでよく使う3つのイベントを使ってみよう
  6. 【エクセルVBA】Initializeイベントでワークシートの値をユーザーフォームの初期値にセットする
  7. 【エクセルVBA】AfterUpdateイベントでテキストボックス同士を連動させてみよう

「パーフェクトExcel VBA」発売記念!書店行脚してきたよレポート大阪・京都編

$
0
0

パーフェクトExcel VBAのPOPその2

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

さて、発売から約2週間が経ちました「パーフェクトExcel VBA」!

以前、東京都内の書店さまに挨拶まわりをしてまいりました。

「パーフェクトExcel VBA」発売記念!11の大型書店を行脚したよレポート東京編
いよいよ発売されました「パーフェクトExcel VBA」!きちんと並ぶのか…ドキドキを抱えながら、2日間かけまして都内の11の書店さまにご挨拶まわりしてまいりましたので、レポートをお送りします。

今回は、少し足を伸ばして大阪・京都の書店さまを行脚してまいりましたので、レポートをしていきますよ。

「パーフェクトExcel VBA」発売記念!書店行脚してきたよレポート大阪・京都編です。

大阪・京都のプログラミング本を探す際の大型書店9選としてもどうぞご活用ください。

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

梅田エリア

ジュンク堂書店 大阪本店

大阪編、トップバッターはジュンク堂書店 大阪本店からです。

大阪駅、梅田駅からは南へ少し歩きますが、関西最大級の広さで、ゆったりと書籍を探すことができます。

我らが「パーフェクトExcel VBA」は早速POPを掲載いただきました!

ジュンク堂書店 大阪本店

大阪編では唯一、「Excel VBAを実務で使い倒す技術」と「詳解!GoogleAppsScript完全入門」の計3冊を面陳いただいておりました…

ありがとうございます!

ジュンク堂書店 大阪本店
大阪府大阪市北区堂島1丁目6−20 2階~3階 堂島アバンザ

紀伊国屋書店 グランフロント大阪店

紀伊国屋書店 グランフロント大阪店は、JR大阪駅から直結のおしゃれな複合ビル「グランフロント」の6階にあります。

「パーフェクトExcel VBA」は、残り1冊ですが、ありました!

POPもお渡ししました…よろしくお願いいたします!

紀伊国屋書店 グランフロント大阪店

紀伊国屋書店 グランフロント大阪店
大阪府大阪市北区大深町4−20 南館 6階

ヨドバシカメラ マルチメディア梅田店

ヨドバシカメラ マルチメディア梅田店は、前述のグランフロントから2F通路から直接いけます。

書籍は地下1F。家電屋さんだと、どうだろう…と恐る恐るうかがったのですが…

バッチリありました!

ヨドバシカメラ マルチメディア梅田店

Excel関連だけでなく、プログラミング系書籍もきちんとラインナップされてますよ!

ヨドバシカメラ マルチメディア梅田店
大阪府大阪市北区大深町1−1

紀伊國屋書店 梅田本店

続いて、紀伊國屋書店 梅田本店。阪急三番街の1Fを入ると、一気に広大で賑やかな書店内にいざなわれます。

夕方ということもあり、レジも混雑していて、これはタイミング間違えたな~と思ったのですが、快くご対応いただきました。

拙著もバッチリ、面出しいただいてます。ありがとうございます!

紀伊國屋書店 梅田本店

紀伊國屋書店 梅田本店
大阪府大阪市北区芝田1丁目1−3 阪急三番街

MARUZEN&ジュンク堂書店梅田店

梅田編の最後は、MARUZEN&ジュンク堂書店梅田店です。

とても広いのですが、棚の背が高くて面陳列がたくさんあるので、とても書籍を探しやすいです。

店員さまに本当によく対応いただきまして、POPも早速掲載いただきました。

MARUZEN&ジュンク堂書店梅田店

「パーフェクトExcel VBA」だけでなく「詳解!GoogleAppsScript完全入門」もメッセージを書かせていただきました…ありがとうございます!!!

後日掲載されると思いますので、お楽しみに!

MARUZEN&ジュンク堂書店梅田店
大阪府大阪市北区茶屋町7-20 チャスカ茶屋町

本町エリア

紀伊國屋書店 本町店

大阪、本町にある紀伊國屋書店 本町店

街の本屋さんのような雰囲気ですが、プログラミング本もしっかり充実しております。

「パーフェクトExcel VBA」はバッチリ平積み…ありがとうございます!

紀伊國屋書店 本町店

紀伊國屋書店 本町店
大阪府大阪市中央区安土町2丁目3−13 大阪国際ビルディング 1階

京都エリア

丸善 京都本店

では、京阪電車に乗り換えて…京都にやってきました。

まずは、丸善 京都本店。「京都BAL」というオシャレビルの地下に広がる異空間のような書店です。

ありました!1冊ですが…POPもお渡しできましたので、展開をお祈り!

丸善 京都本店

丸善 京都本店
京都府京都市中京区河原町通三条下ル山崎町251 京都BAL 地下1階~地下2階

ジュンク堂書店 京都店

四条通りをグングン歩くと、古き良き時代感たっぷりのジュンク堂書店 京都店があります。

他の多くのジュンク堂書店と同様に、ビルがまるっと書店になっているスタイル。コンピュータ関連は4Fです。

「パーフェクトExcel VBA」は、売れてて残り2冊が棚差しになっていましたが、写真撮影のために表紙を出してくださいました。

…ありがとうございます!!

ジュンク堂書店 京都店

ジュンク堂書店 京都店
京都府京都市下京区立売東町20−1 1階~5階 ステラ四條ビル 四条通り

大垣書店 京都ヨドバシ店

JR京都駅近くのヨドバシカメラの6Fにある大垣書店 京都ヨドバシ店

電気屋さんの上にありながらも、かなり広くて、プログラミング本も充実しています。

「パーフェクトExcel VBA」もバッチリ面出しいただいてました!

大垣書店 京都ヨドバシ店

大垣書店 京都ヨドバシ店
京都府京都市下京区東塩小路町590−2 京都ヨドバシ 6F

まとめ

「パーフェクトExcel VBA」発売記念!書店行脚してきたよレポート大阪・京都編をお送りしました。

全9店のうち、ほとんどの書店さまで展開いただいていましたね。ありがとうございます!!

今は、Amazonなどでも購入はできますが、実際に手にとってパラパラとめくることができる書店。

各地の書店さんがそれを支えてくださっているんだと、改めて感じました。

また、あちこち見に行きたいですね…!

書籍「パーフェクトExcel VBA」関連記事

書籍「パーフェクトExcel VBA」に関連して、本書自体や、執筆に関する裏話や出来事、ノウハウ、イベントレポートなどを連載していきます。
  1. 書籍「パーフェクトExcel VBA」発売についてのお知らせ
  2. なぜ、Excel VBAの本格解説本を書く必要があるのか
  3. 11/25発売「パーフェクトExcel VBA」のまえがきを全文無料公開
  4. 書籍「パーフェクトExcel VBA」で書いた文字数とかかった時間を晒します
  5. 本日発売「パーフェクトExcel VBA」のあとがきを全文無料公開
  6. 「パーフェクトExcel VBA」発売記念!11の大型書店を行脚したよレポート東京編
  7. 「パーフェクトExcel VBA」発売記念!書店行脚してきたよレポート大阪・京都編
その他、本書に関する情報を随時更新していきますね。 どうぞお楽しみに!

ノンプロ研チーム大阪で初の「1年の振り返りBT大会」を開催しました!

$
0
0

nonpro-event-board

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

「ノンプログラマーのためのスキルアップ研究会」は、ノンプログラマーがプログラミングをはじめとするITスキルを学び合うコミュニティです。

ノンプロ研のチーム大阪発足から、1年と少し経ちました。

昨年、東京で年末に開催して大盛りあがりでした「BT大会」を、なんとか開催したいな~と思っていたのですが、実現できました!

ということで、今回はノンプロ研チーム大阪忘年会「1年の振り返り BT大会@大阪」の開催レポートについてお伝えします。

ちなみに当日の様子は以下、Togetterのツイートまとめもご覧くださいませ。

ノンプロ研チーム大阪忘年会「1年の振り返り BT大会@大阪」
2019年最後、今年はチーム大阪でもBT大会を開催いたします! 参加者全員に、BTプレゼンを行っていただきます。   BTとはBeer Talk、つまり飲みながらのLTです。5分のプレゼンをご準..

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

ノンプロ研チーム大阪忘年会「1年の振り返り BT大会@大阪」とは

まず、今回のイベントノンプロ研チーム大阪忘年会「1年の振り返り BT大会@大阪」とは何?ということですよね。

参加者全員プレゼンのBT大会

「BT」というのは「Beer Talk」の略で、飲食しながら皆さんにプレゼンをしてもらうというスタイルのイベントです。もちろんアルコールもOK。

開始前からいただいております。

010-beer-talk

ノンプロ研で行われるBT大会では、参加者は全員、5分間のプレゼンをしていただくというのがルールです。

今回は、フューチャー・ファシリテーション カフェのスペースをお借りして開催させていただきました!

皆さんのプレゼンから感じたこと

忘年会を兼ねていましてイベントとしても「1年の振り返り」という冠をつけておりますので、皆さんの発表は

  • 今、現在取り組んでいるVBAのプロダクトについて
  • 今年の目標が達成できたか
  • VBAの勉強会を社内で開催したこと
  • 今年1年間のプログラミング活動の振り返り
  • 自己紹介となぜノンプロ研に入ったのか
  • チーム大阪の活動報告
  • ノンプロ研と通して2019年にできたこと
  • 2019年の振り返り

というように、皆さんそれぞれの成果や、挑戦、楽しみ、想いなど、それぞれの言葉で聴くことができました。

教えることは二度学ぶこと

ノンプロ研のモットーである「教えることは二度学ぶこと」というワード、もう皆さん普通に使っていらっしゃると感じました。

私自身、大阪には年に何度かしかおうかがいできないので、身近で様子を見られない…という心配はありました。

ただ今回、コミュニティで大事にしている部分をばっちり消化・実践されていらっしゃると知りました。

私の心配など、杞憂だったなと反省です。

ここから引き続き、この大阪の地でも「働く」の価値を上げる輪が広がっていけばいいな~と思います。

コミュニティは人

例えば、東京では70名くらいいて、毎月1回の定例会や、3回のもくもく会が成り立っています。

それに対して、チーム大阪は全体で11名。メンバー数としては毎月定期的にメンバーを集めてイベントを成立させるのは意外と大変だったと思います。

ですが、 東京から出張して大阪講座のTAやもくもく会のモデレーターをやってくださってた きのぴぃさん、初回イベントや今回のイベントもモデレートしてくださった 寺戸慎也さん、いつものもくもく会の会場手配や朝もくの開催をしてくださっている 松本裕美さんやJAMSTOREの皆さん。

もちろん他の皆さんも含めて、ひとりでも足りなかったら、この集まりはできてなかったよな…と思います。

やっぱりコミュニティは人なんですね。みなさんの学びとギブに感謝!

まとめ

以上、ノンプロ研チーム大阪忘年会「1年の振り返り BT大会@大阪」の開催レポートをお送りしました。

前回、夏に来阪したときに「BT大会を大阪でもやりたい!」と誓ったのですが、今回実現できて本当に良かった…!

「ノンプロ研大LT大会@大阪」イベントレポートとチーム大阪の変遷とこれから
先日ノンプロ研のイベント「大LT大会@大阪」が開催されました。今回は、そのイベントレポートとともに、ノンプロ研チーム大阪の発足からの変遷とこれからの活動、やりたいことなどについてお伝えしてまいります。

次回、うかがうときは、何かテーマを持ったイベントを仕掛けたいですね。

結局、楽しいからってBTだったりして…汗

いずれにしても、またうかがいますので、よろしくお願いいたします~!

「ノンプログラマーのためのスキルアップ研究会」について

コミュニティ「ノンプログラマーのためのスキルアップ研究会」では、毎月の定例会や勉強会、Slackでのやり取りを通して、皆さんのプログラミング学習の質やモチベーションを高めるための活動をしています。 過去の活動については、以下のページをご覧ください。
コミュニティ「ノンプログラマーのためのスキルアップ研究会」の活動レポートまとめ
コミュニティ「ノンプログラマーのためのスキルアップ研究会」(略して「ノンプロ研」)。このページはその活動レポートまとめページです。コミュニティ活動の一気読みをされたい方、ぜひご活用くださいませ。
ぜひ、皆様のご参加をお待ちしております!
コミュニティ「ノンプログラマーのためのスキルアップ研究会」についてのお知らせ #ノンプロ研
ノンプログラマーがVBA・GAS・Pythonなどのプログラミングを学ぶコミュニティ「ノンプログラマーのためのスキルアップ研究会」が絶賛活動中です!本ページはコミュニティの情報発信をしていく特集ページです。

GASのデータベースとして、なぜCloud SQLが有効なのか?その概要とメリット

$
0
0

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

Google Apps Script(GAS)でそこそこの規模のアプリケーションを作成していると、スプレッドシートでのデータの扱いが限界に達したり、やりづらくなったりといったことが起きてきます。

そこで、一歩踏み出してトライしてみたいのが、Cloud SQLをデータベースとして使用するという選択肢です。

Cloud SQLでは「ちゃんとしたデータベース」を使えますので、スプレッドシートよりもより大量のデータを、より高速、かつより強固に扱うことができます。

このシリーズでは、GASからJDBCサービスを使ってCloud SQLを操作する方法を、順を追ってお伝えしていきます。

初回の今回は、GASのデータベースとして、なぜCloud SQLが有効なのか?その概要とメリットについてお伝えします。

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

スプレッドシートをデータベースにする弊害

皆さんが作っているGASのアプリについて思い起こしてみましょう。

主にデータの置き場、つまりデータベースとしてスプレッドシートを使用している場合が圧倒的に多いことでしょう。

ただし、スプレッドシートをデータベースとして使用し続けていると、色々と問題が出てきます。

このようなものです。

  • データが増えてくると動作が重くなる、ていうか500万セルまでしか受け付けない
  • うっかり権限与えると、気ままにいじられる

これらを回避するために、複数のスプレッドシートにデータを分散させたり、スプレッドシートに保護をかけたり、様々なテクニックを駆使するのですが、そうするとスクリプトの行数が増えて、メンテナンスが大変になってきます。

そこで、一つの選択肢として検討したいのが、Cloud SQLをデータベースとして使用することです。

Cloud SQLとは?なぜ使うの?

Cloud SQLというのは、Google Cloud Platform(GCP)内で提供されているデータベースサービスです。

GCPというのは、簡単にいうと、クラウド上の色々な役割を持つサーバーを使えるサービスで、アプリケーションを配置したり、機械学習を使用したり、今回の目的のようにデータベースを作成して使用したりすることができます。

どちらかというと、全体的に本職のITエンジニア向けのサービスで、ちょっと敷居が高いように思えます。

また、GCPはG Suiteとは別サービスで、その利用状況によって別途課金が発生します。

ただ、GASによるアプリとそのデータ量に規模感が出てくると、前述の「スプレッドシートをデータベースにする弊害」とのトレードオフになってきます。

Cloud SQLを使い始める技術的なハードル + Cloud SQLを利用するための料金 <= スプレッドシートをデータベースにする弊害

であれば、トライしても良いのではないでしょうか?

新しいことも学べますしね。

GASからCloud SQLを使用するための手順

GASからCloud SQLを使用するためには、以下のステップを踏む必要があります。

  1. GCPを使える状態にする
  2. Cloud SQLのインスタンスを用意する
  3. Cloud SQLのインスタンスにデータベースを作成する
  4. GASのJDBCサービスでCloud SQLのデータベースに接続し、SQLで操作をする

Cloud SQLとインスタンス

Cloud SQLについては本シリーズで手順とともに解説をしていきますので、それほど構えなくても大丈夫です。

ざっくり解説すると、インスタンスというのが仮想的なサーバーのひとつひとつのことです。

GCP上にCloud SQLのインスタンスを(お金さえ払えば)たくさん作れます。

その中に、データベースを作ることができ、その作成したデータベースに、テーブル(表)を作成、データを格納していくわけです。

JDBCサービスとは

JDBCサービスはGASのScript Servicesに含まれるサービスで、Cloud SQLをはじめとするいろいろな種類のデータベースに接続して、命令を実行するためのサービスです。

GASの書き方と、データベースについての概要がわかっていれば、すぐに理解できると思います。

こちらも随時解説していきますね。

SQLとは

SQLというのは、データベースの操作をするための言語です。

「SELECT」「INSERT」「DELETE」「CREATE」などの命令文を使って、データベースのデータを抽出、挿入、削除、テーブルの作成などといった操作を行うことができます。

また、新しい言語かよ~となるかも知れませんが、SQLを学ぶメリットは多くあります。

  • Cloud SQLに限らず、さまざまな種類のデータベースで共通で使用できる
  • Googleのデータ解析ツールBigQueryでも使える
  • スプレッドシートのQUERY関数にも応用できる

といったように、かなり「潰し」の効くスキルということ。SQLは一度学べば横展開が可能で、分析系の業務では非エンジニアでもマスターされる方が増えています。

まとめ

以上、GASのデータベースとして、なぜCloud SQLが有効なのか?その概要とメリットについてお伝えしました。

これを機に、データベースの世界に少し足を踏み入れてもよいのではないでしょうか。

GASでのデータの扱いがこうあるべき、みたいなところもより見えてくるものと思います。

次回から、実際にGCPを触ることろをはじめていきましょう。

どうぞお楽しみに!

GASでデータベースとして使用するCloud SQLインスタンスを作成する方法

$
0
0

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

GASからJDBCサービスを使ってCloud SQLのデータベースにアクセスする方法をシリーズでお伝えしています。

前回の記事はこちら。

GASのデータベースとして、なぜCloud SQLが有効なのか?その概要とメリット
今回から、GASからJDBCサービスを使ってCloud SQLを操作する方法をシリーズでお伝えしていきます。まずデータベースとして、なぜCloud SQLが有効なのか?その概要とメリットについてお伝えします。

なぜ、データベースとしてCloud SQLを検討するのか、またその概要についてお伝えしました。

今回から、具体的に作業を開始しますよ。

GASでデータベースとして使用するCloud SQLインスタンスを作成する方法をお伝えしていきます。

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

GCPの無料アカウント登録

まず、Cloud SQLを使用するには、Google Cloud Platform(GCP)への登録が必要になります。

前回もお伝えしましたが、GCPはG Suiteとは別のサービスで、別途料金が発生します。

ただ、GCPは無料トライアルを実施していて、300ドル分までは使用可能なので、それを使って色々と試すと良いでしょう(執筆時点ではありますが)。

トライアルの登録については、以下の記事でまとめています。App Makerのシリーズではありますが、ほとんど変わりないので、その通りに進めていただければと思います。

Google Cloud Platform(GCP)に無料トライアル登録をする方法
ノンプログラマー向けにCloud SQLのはじめかた&App Makerアプリの作り方についてシリーズでお伝えしています。今回は、Google Cloud Platform(GCP)に無料トライアル登録をする方法です。

既に、社内で使用しているのであれば、システムのご担当者と相談しながら進めてください。

いずれにしても、Cloud SQLのテストであれば、月1000円程度の課金でなんとかなる場合が多いので、あまり構えずにトライしてみてください。

Cloud SQLとインスタンス

トライアルの登録とともに、「プロジェクト」を作成したはずなので、その配下にCloud SQLのインスタンスを作成します。

プロジェクトというのは、GCPにおいて課金の単位になるもので、計上を分けたい場合はプロジェクトを分けると良いです。

ここでは、前述の無料トライアルの登録で作成した「My First Project」に作成していくこととします。

インスタンスとは

インスタンスとは、仮想コンピュータのことです。

GCPでは、いろいろな種類の仮想コンピュータが用意されていて、プロジェクトの中に複数作成することができます。

作成すると、そのスペックや使用状況に応じて課金が発生します。

今回は、データベース用のCloud SQLのインスタンスをテスト用に一個だけ作成していきます。

Cloud SQLのインスタンスを作成する

では、Cloud SQLのインスタンスを作成する手順を見ていきましょう。

まず、以下URLからGCPのコンソールにアクセスします。

Google Cloud プラットフォーム
Google Cloud Platform では、Google と同じインフラストラクチャでアプリケーション、ウェブサイト、サービスを構築、導入、拡大することができます。

コンソールが開いたら、ナビゲーションメニューから「SQL」を選択をします。

GCPコンソールのナビゲーションメニューからSQLを選択

次の画面で、上部の「+CREATE INSTANCE」をクリックします。

GCPのCloud SQLでCREATE INSTANCEを選択

続く画面ではデータベースエンジンを選択しますが、ここでは「MySQLを選択」を選んでください。

GCPのCloud SQLでMySQLを選択

インスタンス情報の設定

次に、作成するインスタンスの情報を入力していきます。

ここは、基本的に以下の記事で作成するものと同じなので、参考にしながら進めてみてください。

ノンプログラマー向けApp Maker用のCloud SQLのインスタンスを作成する方法
ノンプログラマー向けにCloud SQLのはじめかた&App Makerアプリの作り方についてシリーズでお伝えしています。今回は、GCPコンソールでCloud SQLのインスタンスを作成する方法をお伝えします。

さて、今回は以下のとおりに設定しました。

  • インスタンスID: jdbc-test
  • rootパスワード: お好きなパスワード
  • リージョン: us-central1のまま
  • ゾーン: 任意のまま
  • データベースのバージョン: MySQL 5.7のまま

インスタンスIDは好きなものでOKです。

パスワードは後ほど使用しますので、忘れずにメモっておきましょう。

GCPで作成するCloud SQLインスタンスの設定オプション

入力したら、「設定オプションを表示」でオプション内容を展開してください。

設定オプションの入力

設定オプションでは、いろいろと設定できますが、以下のように設定をしていきます。

  • マシンタイプ: db-f1-micro
  • ストレージの種類: HDD
  • バックアップの自動化: オフ

GCPで作成するCloud SQLインスタンスのマシンタイプ

GCPで作成するCloud SQLインスタンスの設定と作成

マシンタイプや容量、アクセスして取得したデータ量によって料金が変わってきますが、特に影響が大きいのがマシンタイプです。

今回は、テスト用ということで、超最低限のスペックにしていまして、弊社調べでは月間1000円程度の支払になります。

本番で使用する場合は、バックアップの自動化をオンにしたり、容量や求めるスピードに合わせて調整していくと良いでしょう。

入力が完了したら「作成」でインスタンスの作成がはじまり、数分後に以下のように完了の通知が表示されます。

GCPでCloud SQLのインスタンスを作成した

これで、Cloud SQLのインスタンスの作成は完了です。

まとめ

以上、GASでデータベースとして使用するCloud SQLインスタンスを作成する方法をお伝えしました。

Cloud SQLは課金がいくらかわかりづらいのと、難しい単語が多いので構えてしまいがちですが、ここまではさほど難しくはないはず…!

次回は、作成したインスタンスにデータベースを作成していきます。

どうぞお楽しみに!

連載目次:GASのJDBCサービスでCloud SQLのDBを操作する

GASのデータベースの多くはスプレッドシートを使用しますが、ちゃんとしたデータベースを使用したい場合があります。そこで、JBDCサービスを使ってCloud SQLを使用する方法をシリーズでお伝えしていきます。
  1. GASのデータベースとして、なぜCloud SQLが有効なのか?その概要とメリット
  2. GASでデータベースとして使用するCloud SQLインスタンスを作成する方法

GCPのCloud Shellを使ってCloud SQLインスタンスに接続する方法

$
0
0
connect

photo credit: www.ilmicrofono.it connect audio via photopin (license)

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

GASからJDBCサービスを使ってCloud SQLのデータベースにアクセスする方法をシリーズでお伝えしています。

前回の記事はこちら。

GASでデータベースとして使用するCloud SQLインスタンスを作成する方法
GASからJDBCサービスを使ってCloud SQLのデータベースにアクセスする方法をシリーズでお伝えしています。今回は、GASでデータベースとして使用するCloud SQLインスタンスを作成する方法です。

GASからアクセスするCloud SQLのインスタンスを作成する方法をお伝えしました。

さて、インスタンスはできたのですが、まだデータベースがありません。

データベースを作成するために、まずはCloud SQLをコマンド操作できるようにしていきます。

ということで、今回はGCPのCloud Shellを使ってCloud SQLインスタンスに接続する方法をお伝えします。

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

前回のおさらい

前回進めたのは、主に以下の2点でした。

  • GCPへのトライアル登録をしてプロジェクトを作成する
  • 作成したプロジェクト内にCloud SQLのインスタンスを作成する

そんなふうにして作成したのが、以下図にある「jdbc-test」というインスタンスです。

GCPで作成したCloud SQLのインスタンス

インスタンス、つまり仮想サーバーはできたのですが、まだ中身は空っぽです。

データベースを作らなければいけません。

ということで、今回はGCPのCloud Shellというツールを使って、インスタンスへの接続とデータベースの作成をしていきます。

Cloud Shellとその開き方

では、そのCloud Shellとやらの使い方を見ていきましょう。

まず、GCPのSQLのページから「jbdc-test」をクリックして開きましょう。

そして、右上の「Cloud Shellをアクティブにする」アイコンをクリックします。

すると、画面下部に「Cloud Shell」

GCPでCloud Shellをアクティブにする

その後、画面下部に黒いエリアが登場し、以下のようなメッセージが表示されます。

接続しています: Google Cloud Shellマシンをプロビジョニングしています

しばらく待つと、その黒いエリアに何やら以下のように歓迎のメッセージが表示されます。

Welcome to Cloud Shell! Type “help” to get started.
Your Cloud Platform project in this session is set to [プロジェクトID].

GCPのCloud Shell

Cloud Shellとは

そもそも、Cloud Shellとはなんでしょうか?

先ほどの手順の途中で「続行」ボタンを押す前に、このようなメッセージが表示されていました。

Google Cloud Shell ではコマンドラインを使って、お使いのブラウザから直接クラウド リソースにアクセスできます。そのため、Google Cloud SDK などのツールをシステムにインストールすることなく、プロジェクトやリソースを簡単に管理できます。

コマンドライン、クラウドリソース、Google Cloud SDK…難しい単語が並んでいますが、本シリーズの文脈で簡単に言い直すとこうなります。

Google Cloud Shellの画面でコマンド入力してCloud SQLを操作できます。

Cloud SQLインスタンスに接続する

では、実際にコマンド入力をしてCloud SQLに接続していきましょう。

接続することで、はじめて操作ができるのです。

さて、Cloud Shellに表示されていたメッセージの最後の行ですが、

username@cloudshell:~[プロジェクトID]:~$

と表示されていますが、「$」記号の後にカーソルがあり、そこにコマンドを入力して実行できます。

「$」は入力をうながす記号で、プロンプトといったりもしますね。

試しに、以下のように入力して [Enter] してみましょう。

gcloud sql connect jdbc-test –user=root

これは、Cloud SQLインスタンスに接続するコマンドで、一般的には以下のようになります。

gcloud sql connect [インスタンス名] –user=[ユーザー名]

コマンド実行して、しばらく経った後に

Connecting to database with SQL user [root].Enter password:

と表示されるので、インスタンス作成時に設定したパスワードを入力して [Enter] します。

(このパスワード入力時、カーソル表示など入力している感がなく不安になるのですが、気にせずどうぞ)

すると、以下のようにプロンプトが「mysql>」という表示に変わります。

GCPのCloud ShellでMySQLのプロンプトを表示した

これはMySQLのプロンプトで、Cloud SQLインスタンスにSQL文で操作できるというものです。

具体的には、次回の記事で進めていきましょう。

まとめ

以上、GCPのCloud Shellを使ってCloud SQLインスタンスに接続する方法をお伝えしました。

ノンプログラマー的にはCloud Shellは遠い存在ではありますが、一度触っておいても損はないと思います。

手順通り進めるだけなら難しくありませんしね。

次回、MySQLのプロンプトでSQL文を実行していきましょう。

どうぞお楽しみに!

連載目次:GASのJDBCサービスでCloud SQLのDBを操作する

GASのデータベースの多くはスプレッドシートを使用しますが、ちゃんとしたデータベースを使用したい場合があります。そこで、JBDCサービスを使ってCloud SQLを使用する方法をシリーズでお伝えしていきます。
  1. GASのデータベースとして、なぜCloud SQLが有効なのか?その概要とメリット
  2. GASでデータベースとして使用するCloud SQLインスタンスを作成する方法

【エクセルVBA】ユーザーフォームのリストボックスを使ってみよう!

$
0
0

ユーザーフォーム,リストボックス

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

エクエルのユーザーフォームを作って使ってみることを目標に、連載記事でユーザーフォーム上のコントロールのプロパティやイベントをご紹介しています。

前回は、コマンドボタンのClickイベントで、ワークシートの値を、テキストボックスに入力されている値で更新する方法をご紹介しました。

【エクセルVBA】コマンドボタンのClickイベントでワークシートを更新してみよう
エクセルのユーザーフォームを作って使ってみるまで、を目標にした連載記事です。 今回は、エクセルのユーザーフォーム上に入力した値で、ワークシート上のリストを更新・追加する方法をご紹介しています。ユーザーフォームを使ってマスタ管理ツールなどを作りたい場合に、使える方法ですよ。

ここまでテキストボックスに関係したイベントばかりをご紹介していましたので、今回からはリストボックスをご紹介していきたいと思います。

リストボックス編初回の今回は、ユーザーフォームにリストボックスを追加する方法と、よく使うプロパティをいくつかご紹介していきますよ!

前回までのおさらい

前回までに作成したユーザーフォームがこちら。

ユーザーフォーム,オブジェクト名

テキストボックスとラベルが2つずつと、コマンドボタンが1つ配置されていますね。

今までの記事では、この2つのテキストボックスを連動させたり、値をワークシートに転記してみたりしていましたが、今回はからは、画面の下側にあるテキストボックスをリストボックスに置き換えていきましょう。

リストボックスってどんなもの?

そもそもリストボックスってどんなものなの?というところから見ていきましょう。

リストボックスは、こんな見た目をしています。

ユーザーフォーム,リストボックス

テキストボックスのような見た目のコントロールに、値がリスト形式で並んでいますね。

リストボックスは、図のように表示したい値をリスト形式で表示して、入力者に任意の値を選択させることができるコントロールです。

フォームにリストボックスを追加する

まずは、フォームにリストボックスを追加していきましょう。

もともとあったテキストボックスは一旦削除しておいたので、フォームはこのようになっています。

ユーザーフォーム,テキストボックス削除

では、もともとテキストボックスがあった場所に、リストボックスを追加してみましょう。

ツールボックスを開いて、リストボックスのアイコンをクリックします。

ユーザーフォーム,リストボックス,ツールボックス
マウスカーソルの形が「+」になったら、フォーム上でリストボックスを追加したい場所でドラッグすれば…
ユーザーフォーム,リストボックス追加

この通り、リストボックスがフォームに追加されます。

リストボックスの縦の大きさに合わせる為に、フォーム全体の縦の大きさも少し大きくしておきました。

ツールボックスが画面に表示されていない!という方は、こちらの記事で表示方法をご紹介していますので、併せてご覧ください。

【エクセルVBA】Showメソッドでユーザーフォームをコマンドボタンから開いてみよう!
エクセルの便利機能、ユーザーフォームの作り方と使い方を、連載記事でご紹介しています。今回は、ユーザーフォームにラベルやテキストボックスといったコントロールを追加する方法と、作成したユーザーフォームをワークシートから呼び出す方法をご紹介しています。

リストボックスにオブジェクト名をつける

フォームやテキストボックス、リストボックスなどのコントロールは、任意のオブジェクト名を付けられるのでしたね。

今回追加したリストボックスにも、オブジェクト名をつけておきましょう。
リストボックスのプロパティを開いて…
リストボックス,オブジェクト名

プロパティシートの先頭にある、「(オブジェクト名)」という項目の値を変えれば、オブジェクト名の命名完了です。

今回追加したリストボックスには、「ListRegion」というオブジェクト名をつけました。

リストボックスのプロパティ

プロパティシートを見てわかるように、リストボックスにも多くのプロパティがあります。

今回追加したリストボックスを便利に使えるように、プロパティの設定をしていきましょう。

今回は、プロパティシートの中でもよく使うものをいくつかピックアップしてご紹介していきますよ。

リストボックスに表示させるワークシート上の範囲を指定する:RowSourceプロパティ

まずは、リストボックスに表示させる値を設定するプロパティ、RowSourceプロパティです。

例えば、こちらのリストのB列をリストボックスに表示させたい場合。

テキストボックス,検索用テーブル

このRowSourceプロパティに「B2:B7」をセットすれば…

リストボックス,RowSource

この通りリストボックスに、指定したワークシートの範囲にある値が表示されます。

リストの値を複数選択させるかを設定する:MultiSelectプロパティ

お次は、リストボックスに表示されている値を、複数選択できるようにするかを設定する、MultiSelectプロパティです。

このプロパティに設定できる値と、それぞれの動作は以下の3通りです。

リストボックスの用途に合わせて、値の選択方法を選べますね。

設定値 動作
0 – fmMultiSelectSingle リストボックスの値を、1つだけ選択できるようにする
1 – fmMultiSelectMulti リストボックスの値を、Ctrlキーと左クリックで複数選択できるようにする
2 – fmMultiSelectExtended リストボックスの値を、マウスのドラッグで複数選択できるようにする

リストボックスに表示する列数を設定する:ColumnCountプロパティ

リストボックスは、複数列にすることもできますよ。

この、ColumnCountプロパティの設定値に2以上の数値を設定すれば、リストボックスの列数を指定した数にすることができます。

例えば2と指定した場合、このように2列のリストを表示することができますよ。
リストボックス,ColumnsCount

リストボックスの何列目をValueプロパティの値にするかを設定する:BoundColumnプロパティ

ColumnsCountプロパティで2以上の値を設定した時に使うプロパティ、BoundColumnプロパティです。

このプロパティは、リストボックスのどの列を、このリストボックスのValueプロパティで取得できるようにするかを設定します。

例えば、ColumnsCountプロパティに3を、このBoundColumnsプロパティに1を設定した場合、リストボックスには3列のリストが表示されて、Valueプロパティでこのリストボックスの値を取得する際は、1列目の値が返されることになります。

プロパティだけ見ているとあまり関係ないような気がするプロパティですが、VBAで操作する際には重要になってきます。

最後に

今回は、ユーザーフォームのリストボックスをフォームへ追加する方法と、代表的なプロパティをご紹介しました。

リストボックスは、ユーザーフォームでマスタ管理画面を作りたいときなど、何かと便利に使えるコントロールです。

次回記事では、このリストボックスで選択された値の取得方法や、メソッドをご紹介していきますよ。

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

連載目次:【エクセルVBA】ユーザーフォームを使ってみよう!

ユーザーフォームは、ちょっとした画面なら作れてしまう、便利な機能です。

何となく敷居が高いように感じてしまいますが、順を追っていけば難しいことはありませんよ。

  1. 【エクセルVBA】ユーザーフォームを作ってみよう!VBEでフォームを挿入する方法
  2. 【エクセルVBA】Showメソッドでユーザーフォームをコマンドボタンから開いてみよう!
  3. 【エクセルVBA】コマンドボタンのClickイベントとUnloadステートメントでユーザーフォームを閉じる方法
  4. 【エクセルVBA】テキストボックスのプロパティで入力を便利にしよう
  5. 【エクセルVBA】テキストボックスでよく使う3つのイベントを使ってみよう
  6. 【エクセルVBA】Initializeイベントでワークシートの値をユーザーフォームの初期値にセットする
  7. 【エクセルVBA】AfterUpdateイベントでテキストボックス同士を連動させてみよう
  8. 【エクセルVBA】コマンドボタンのClickイベントでワークシートを更新してみよう

GCPのCloud SQLインスタンスにSQL文でデータベースを作成する方法

$
0
0

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

GASからJDBCサービスを使ってCloud SQLのデータベースにアクセスする方法をシリーズでお伝えしています。

前回の記事はこちら。

GCPのCloud Shellを使ってCloud SQLインスタンスに接続する方法
GASからJDBCサービスを使ってCloud SQLのデータベースにアクセスする方法をシリーズでお伝えしています。今回は、GCPのCloud Shellを使ってCloud SQLインスタンスに接続する方法です。。

GCPのCloud ShellでCloud SQLのインスタンスに接続して、MySQLのプロンプトを表示するところまでお伝えしました。

これで、SQLを使ってデータベースの操作が行えますので、試しにやってみましょう。

ということで、今回はGCPのCloud SQLインスタンスにSQL文でデータベースを作成する方法です。

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

前回のおさらい

シリーズとしては、GASで使用するデータベースとしてGCPのCloud SQLを使いたいということで、前々回の記事まででCloud SQLのインスタンスを作成しました。

ただ、インスタンスを作成しただけでは、ただ空っぽの仮想サーバーがあるだけです。

GASからアクセスするには、事前にインスタンス内にデータベースを作成する必要があるんですね。

ということで、前回はコマンドでインスタンスを操作するツールCloud Shellで、「gcloud sql connect」コマンドを使って、Cloud SQLに接続するところまで進めました。

接続すると、以下のようにMySQLにログイン状態となり、「SQL」によりデータベースに関する操作を行えるようになります。

GCPのCloud ShellでMySQLのプロンプトを表示した

MySQLとは

断りなく連呼して来ましたが、そもそも「MySQL」とはなんでしょうか?

MySQLとは「データベース管理システムの種類の一つ」です。

MySQLは、オープンソースで、Facebook・YouTube・Twitterなどのサービスをはじめ世界中で利用されている有名なデータベース管理システムです。

GCPのCloud SQLでは、MySQLのほかに、「PostgreSQL」「SQL Server」のいずれからから選択することができます。

SQLとは

SQLとは、データベースを操作するためのデータベース言語です。

ISO(国際標準化機構)で規格化されていますので、MySQLに限らずさまざまな種類のデータベース管理システムで同様に使用することができる、とても「つぶし」のきく言語です。

なにかの略かな?と思われるかも知れませんが、「何らかの略語ではない」と定義されているそうです。

むずむずしますね。

データベースの作成や、テーブルの作成や結合、データの検索・挿入・削除・更新などといった命令を行うことができます。

SQLでデータベースを操作する

では、実際にSQLを使ってデータベースを操作してみましょう。

CREATE DATABASE文でデータベースを作成する

Cloud Shellで、Cloud SQLのインスタンス「jdbc-test」に接続、MySQLにログインした状態で以下のように入力、 Enter としてみてください。

CREATE DATABASE guestbook;

実行すると、以下のように表示されます。

GCPのCloud SQLにCREATE DATABASE文

これは、CREATE DATABASE文というもので、その名の通りデータベースを作成する命令です。

以下の書式でデータベース名を名前とするデータベースを作成することができます。

CREATE DATABASE データベース名;

これで、「guestbook」という名前のデータベースが作成されたわけですね。

ちなみに、SQLでは命令の最後にセミコロン(;)を付与しますよ。

データベースはCloud SQLのメニューから作成可能

補足ですが、データベースを作成するだけなら、Cloud SQLのメニューから「データベース」→「データベースを作成」とたどることで行えます。

GCPのCloud SQLのメニューからデータベースを作成

SHOW文でデータベース一覧を表示する

では、本当にデータベース「guestbook」が作成できたのか、確認してみましょう。

データベース一覧を表示するには、SQLのSHOW文を使用することができます。

SHOW DATABASES;

コマンドを実行すると、以下のように表示され、確かに「guestbook」が作成できていることを確認できます。

GCPのCloud SQLにSHOW DATABASES文

まとめ

以上、GCPのCloud SQLインスタンスにSQL文でデータベースを作成する方法をお伝えしました。

少しずつCloud Shellの黒い画面にも慣れてきましたかね…?

次回は、データベースに「テーブル」を作成していきます。

どうぞお楽しみに!

連載目次:GASのJDBCサービスでCloud SQLのDBを操作する

GASのデータベースの多くはスプレッドシートを使用しますが、ちゃんとしたデータベースを使用したい場合があります。そこで、JBDCサービスを使ってCloud SQLを使用する方法をシリーズでお伝えしていきます。
  1. GASのデータベースとして、なぜCloud SQLが有効なのか?その概要とメリット
  2. GASでデータベースとして使用するCloud SQLインスタンスを作成する方法
  3. GCPのCloud Shellを使ってCloud SQLインスタンスに接続する方法

GCPのCloud SQLデータベースにSQLでテーブルを作成する方法

$
0
0
tables

photo credit: irio.jyske Ready fo dinner via photopin (license)

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

GASからJDBCサービスを使ってCloud SQLのデータベースにアクセスする方法をシリーズでお伝えしています。

前回の記事はこちら。

GCPのCloud SQLインスタンスにSQL文でデータベースを作成する方法
GASからJDBCサービスを使ってCloud SQLのデータベースにアクセスする方法をシリーズでお伝えしています。今回はGCPのCloud SQLインスタンスにSQL文でデータベースを作成する方法です。

GCPのCloud Shellで、SQL文によりCloud SQLインスタンスにデータベースを作る方法をお伝えしました。

今回は、その続きですね。

データベースができましたので、「テーブル」を作っていきます。

ということで、GCPのCloud SQLデータベースにSQLでテーブルを作成する方法です。

テーブルとは何か、またその仕組についてもお伝えしますよ。

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

前回のおさらい

さて、本シリーズの最終目標は、GASからCloud SQLに作成したデータベースにアクセスをすることです。

前回までで、以下の手順を進めて来ました。

  1. GCPのCloud SQLにインスタンスを作成した
  2. Cloud SQLインスタンス内にデータベースを作成する

GCPのCloud Shellを使うと、Cloud SQLインスタンスに接続でき、その際にMySQLにログインします。

MySQLにログインすると、SQLによりデータベースが操作できるようになり、CREATE DATABASE文でデータベースを作成したわけです。

データベースができたから、GASからアクセスしてデータを操作していこう…!

と、なるわけですが、せっかくなのでもう少しGCPコンソールでデータベースを操作して、慣れておくのも良いかも知れません。

ということで、次の段取りである「テーブルの作成」も、このままCloud ShellでSQLを使って進めてみましょう。

テーブルとは?

データベースを作成したからといって、すぐさまデータを格納できる状態になったわけではありません。

実際のデータは、データベース内の「テーブル」に格納していきますので、続いてテーブルを作成する必要があります。

テーブルとはデータの置き場のことで、データベース内に複数作成することができます。

個々のテーブルには名前をつけることができ、その「テーブル名」で識別をします。

Cloud SQLインスタンスとデータベースとテーブルの関係

レコードとフィールド

テーブルは、以下の図のようにExcelやスプレッドシートのシート上の格子状の表をイメージしてもらえると良いと思います。

テーブル・カラム・レコードのイメージ

「行」にあたる要素を「レコード」といい、一件のデータをひとつのレコードに格納していくことになります。

「列」にあたる要素を「カラム」といいます。

(カラムは、ときに「フィールド」と呼ばれることもあります。)

カラムには、それぞれ名前をつける必要があり、それを「カラム名」といいます。

また、同じカラムには、同じ種類のデータ(例えば、整数・8桁の文字列・日付など)で揃える必要があり、それを「データ型」といいます。

さらに、テーブルのうちいずれかのカラムについて、レコードを識別するための「主キー」に設定する必要があります。

すなわち、テーブルを作るには、以下を指定してあげる必要があるということですね。

  • テーブル名
  • カラムとそのカラム名&データ型
  • 主キーにするカラム名

USE文で使用するデータベースを選択する

では、実際にSQLでテーブルを作成していきましょう。

テーブルを作成する前に、インスタンス内のどのデータベースを操作対象とするか、選択して上げる必要があります。

データベースを選択するには、以下のUSE文を使います。

USE データベース名;

今回は「guestbook」という名前のデータベースを操作したいので、以下SQLを実行すればOKですね。

USE guestbook;

実行すると、以下のように表示されますね。

SQLでデータベースを選択した

Database changed

CREATE文でテーブルを作成する

続いて、選択したデータベースにテーブルを作成します。

テーブルを作成するには、CREATE TABLE文を使います。

CREATE TABLE テーブル名 (カラム名1 データ型1, カラム名2 データ型2, … , PRIMARY KEY(カラム名));

テーブル名の後のカッコ内に、作成するカラム名とそのデータ型をカンマ区切りで列挙します。

そして最後のPRIMARY KEYの後のカッコ内に、主キーとするカラム名を指定します。

例えば、以下のようにして実行してみましょう。

CREATE TABLE entries (guestName VARCHAR(255), content VARCHAR(255),
entryID INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(entryID));

これは、以下の3つのカラム名を作成するものです。

カラム名 データ型 データ型の意味 補足
guestName VARCHAR(255) 255バイト以内の文字列
content VARCHAR(255) 255バイト以内の文字列
entryID INT 整数 主キー、NULLを許可しない、自動でカラム内の最大値+1の値を設定

カラム「entry ID」には色々と追加の命令が付与されていますね。

「NOT NULL」を付与すると、値が存在しない状態を表す「NULL」を許可しないように設定できます。

「AUTO_INCREMENT」を付与すると、自動でカラム内の最大値+1の値を設定するようにできます。

テーブルのカラムを確認する

うまく実行できているかを確認してみましょう。

テーブルのカラム情報を表示するにはSHOW COLUMNS文を使います。

SHOW COLUMNS FROM テーブル名;

今回の場合はこうですね。

SHOW COLUMNS FROM entries;

実行すると、以下のようにカラム構成を確認することができます。

SQLでテーブルのカラム構成を表示する

まとめ

以上、GCPのCloud SQLデータベースにSQLでテーブルを作成する方法をお伝えしました。

テーブルとその仕組みについてもぜひおさらいしておきましょう。

データ型やカラムの設定などについては、あまり触れすぎると深くなりすぎるので、またの機会にきちんとお伝えできればと思います。

では、次回は作成したテーブルにデータを挿入していきたいと思います。

どうぞお楽しみに!

連載目次:GASのJDBCサービスでCloud SQLのDBを操作する

GASのデータベースの多くはスプレッドシートを使用しますが、ちゃんとしたデータベースを使用したい場合があります。そこで、JBDCサービスを使ってCloud SQLを使用する方法をシリーズでお伝えしていきます。
  1. GASのデータベースとして、なぜCloud SQLが有効なのか?その概要とメリット
  2. GASでデータベースとして使用するCloud SQLインスタンスを作成する方法
  3. GCPのCloud Shellを使ってCloud SQLインスタンスに接続する方法
  4. GCPのCloud SQLインスタンスにSQL文でデータベースを作成する方法
  5. GCPのCloud SQLデータベースにSQLでテーブルを作成する方法

ノンプロ研「1年の振り返り大BT大会2days」レポートとコミュニティの歩み&これから

$
0
0

ノンプロ研BT大会2days

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

さて、ノンプログラマーがプログラミングをはじめとするITスキルを学び合うコミュニティ「ノンプログラマーのためのスキルアップ研究会」(通称ノンプロ研)の「ノンプロ研 Advent Calendar 2019」の最終日でございます。

ノンプロ研 Advent Calendar 2019 - Adventar
プログラミング学習を行うノンプログラマーが集まる「ノンプログラマーのためのスキルアップ研究会」メンバーによるカレンダーです。 ハッシュタグは #ノンプロ研アドベントカレンダー です。

ノンプロ研メンバーのきのぴぃさん(@kinopy_techhack )からバトンを受け取りまして、最終日書かせていただきます。

そのノンプロ研ですが、この2019年12月で発足から、めでたく2周年…そして、年末ということもあり、昨年も好評だった「1年の振り返り大BT大会」を開催しました。

なんと、先日レポートをしました大阪BT大会に続き、東京では12/12と12/19のなんと2days!

盛り上がりましたね~

ということで、本記事ではノンプロ研忘年会兼定例会Vol.25&Vol.26「1年の振り返り大BT大会」の開催レポートとして、ノンプロ研の今年の振り返りをしてまいります。

ちなみに東京2daysの様子は以下、Togetterのツイートまとめもご覧くださいませ。

ノンプロ研定例会Vol.25「1年の振り返り大BT大会」days1
2019年最後の定例会は、忘年会も兼ねて大BT大会です。ご参加者された皆さん、全員にBTプレゼンを行っていただくという大変盛り上がるであろう企画です。 BTとはBeer Talk、つまり飲みながら..
ノンプロ研忘年会兼定例会Vol.26「1年の振り返り大BT大会」days2
2019年最後の定例会は、忘年会も兼ねて大BT大会です。しかも今年は2daysで、こちらはその2日目のイベントページになります。ご参加者された皆さん、全員にBTプレゼンを行っていただくという大変盛..

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

ノンプロ研「1年の振り返りBT大会」とは

ノンプロ研では「定例会」というコミュニティの中心になるオフラインイベントがあります。

普段の定例会では、テーマを決めて何名かにガッツリ登壇いただくのですが、12月の定例会は年末ということで、食事とドリンクをいただきながら忘年会も兼ねよう!

ということで、「BT大会」にするというのが毎年恒例となりつつあります。

BTというのは「Beer Talk」の略で、飲みながらのプレゼン大会ですね。そして、今年は会場にケータリングも用意、ドリンクはウェルカムから3時間飲み放題!!

あと、重要な仕掛けとして、ノンプロ研のBT大会は「全員プレゼン」がルール。

5分間の持ち時間で、今年1年間の振り返りを発表していただきました。

今年は2days!のべ38名が登壇

ありがたいことに参加希望が多かったため、東京では2daysの開催というチャレンジ!

今年の定例会でゲスト登壇いただいた皆さんもお誘いして、2daysそれぞれで19人ずつ登壇いただきましたので、合計38名のプレゼンを聴くことができました。

  • ノンプロ研でどんな活動をしたか
  • 会社でのスキル活用&活躍っぷり
  • ノンプロ研で学べたこと
  • 自己紹介・コミュニティに参加したきっかけ
  • 今注目していること
  • プログラミングで実現できたこと
  • 来年への意気込み

などなど…みんな、自由!

そして、面白い!!

社外はもちろんですが、今年はコミュニティとしても人数や活動の幅が広かったので、コミュニティ内の活動報告も多かった印象です。

あと、全員に共通していたのは「楽しんでる」ってことですね。

学ぶこと、教えることって楽しいことなんです。

来年はどんなBT大会になるのか…ワクワクします。

ノンプロ研の活動の歩み

さて、ノンプロ研は2周年を迎えたわけですが、「これまでの歩み」について私から発表させていただきましたので、ここでも一部お知らせできればと思います。

メンバー数と分布

メンバー数は12月時点で92名となりました。

最初の定例会の参加者数は10名、昨年の12月は42名でしたので、グングン伸びております。

オフライン中心のコミュニティなので、どうしても首都圏に人数が集まりがちなのですが、関西を中心に他エリアの皆さんも少しずつ参加いただけるようになってきました。

地方の巻き込みはずっと課題なのですが、来年もあの手この手でトライしていきます。

イベント開催数

定例会

2019年はBT2days含めて13回(累計26回)の開催。

ゲストも11名登壇いただきました。

来年は講座のLT大会は、定例会とは別に開催するので、毎回濃ゆいテーマを用意するつもりです。

1月のテーマは「進撃のMicrosoft」…楽しみです。

もくもく会

2019年は41回開催(!)。都内だけでなく、大阪でも10回開催しております。

来年は、さらに開催場所が増えそうな雰囲気ありますね。

皆さん、ガンガン会場の下見に行ってくださってます。

分科会・ファミプロ

大阪、仙台、高松といった地方での開催に加えて、「はじめてのノンプロ研」といった分科会の開催数もグンと増えました。

家族向けのファミプロも6回開催。

2020年は「英語イベント(仮)」も早速立ち上がりましたね。

じゃんじゃん増やしていきましょう!

プログラミング講座

プログラミング講座は、実は2019年からスタートなのですが、すでに7講座を開催、のべ108名が受講されました。

開催コースは以下の通りです。

  • 初心者VBA
  • 初心者GAS
  • 初心者Python
  • 中級VBA

2020年1月から早速初心者GASコース4期とともに、中級GASコースも初開催ですね。

講座の種類も回数も増やしていきつつ、講師&TAもどんどんメンバーにお任せしていきたいと思います。

オンラインの活用

Slackのアクティブ度

週間アクティブ数は約50~60前後、投稿メンバー数は約30前後です。

メンバー数の増加に合わせて増えてはいるのですが、アクティブ数も投稿数も増やしていきたいですね。

しゃべる人は、それこそ一日中しゃべっているんですけどね…汗

Twitterのアウトプット

これは冒頭のツイートまとめと、以下第1回のツイートまとめを比べていただければ一目瞭然です。

なにせ、初回は @etau0422 さんしかつぶやいてなかったのですから…

ノンプロ研をきっかけにTwitterを始められる方もけっこういらっしゃいます。

じゃんじゃん、アウトプットしましょう。

アドベントカレンダー

昨年のアドベントカレンダーがこちら。

ノンプロ研 Advent Calendar 2018 - Adventar
プログラミング学習を行うノンプログラマーが集まる「(」メンバーによるカレンダーです。 ハッシュタグは #ノンプロ研アドベントカレンダー です。

昨年もちゃんと前日埋まっているのですが、実はひとりで複数日を担当してくださったかたもいらしたんです。

ですが、今年はひとり1日しばりで埋まりました…!

素晴らしい。

来年はA面・B面作りたいな~

ということで、じゃんじゃん、アウトプットしましょう!

ノンプロ研のお仕事

今年からノンプロ研内に「お仕事チーム」を発足したり、登壇やイベント運営に少しばかりお支払いをするようにしまして、総額745,118円をお支払いしました。

具体的には以下のようなお仕事です。

  • 登壇
  • モデレータ
  • 講師・TA(ティーチング・アシスタント)
  • 運営(入退会管理、イベント作成、ページ作成)
  • 動画制作

あとは、紹介制度でAmazonギフトをお渡ししたりもしてますね。

決しておいしい金額ではないですが、新たな体験をする機会や月額を取り返す機会として捉えて、みなさん積極的にお手伝いいただいています(と認識しています)。

まとめ: これからも「機会」を増やしていきます

今年のテーマとしては、皆さんにどんどん教える機会や、活動する機会を増やしていくというのを重視して進めてきました。

はっきり言って、200点満点によくできたのではないかと思っています。

というのも、皆さんそれぞれ得意なことが違うわけで、私では当然出せない価値を提供してくださるんですね。

意外な才能が発見できたり、意外な相乗効果が現れたり、化学変化が常に発生しています。

これは、上意下達型のオンラインサロンやコミュニティではなかなかできない価値の創出の仕方ですし、ノンプロ研の誇らしいところかなと思います。

さて、来年も引き続き、皆さんの「教える機会を増やす」「自分でやる機会を増やす」を目指して、コミュニティ見守りおじさんは頑張りたいと思います。

皆さん、今年も1年ありがとうございました。

来年もどうぞよろしくお願いいたします!

「ノンプログラマーのためのスキルアップ研究会」について

コミュニティ「ノンプログラマーのためのスキルアップ研究会」では、毎月の定例会や勉強会、Slackでのやり取りを通して、皆さんのプログラミング学習の質やモチベーションを高めるための活動をしています。 過去の活動については、以下のページをご覧ください。
コミュニティ「ノンプログラマーのためのスキルアップ研究会」の活動レポートまとめ
コミュニティ「ノンプログラマーのためのスキルアップ研究会」(略して「ノンプロ研」)。このページはその活動レポートまとめページです。コミュニティ活動の一気読みをされたい方、ぜひご活用くださいませ。
ぜひ、皆様のご参加をお待ちしております!
コミュニティ「ノンプログラマーのためのスキルアップ研究会」についてのお知らせ #ノンプロ研
ノンプログラマーがVBA・GAS・Pythonなどのプログラミングを学ぶコミュニティ「ノンプログラマーのためのスキルアップ研究会」が絶賛活動中です!本ページはコミュニティの情報発信をしていく特集ページです。

GCPのCloud SQLデータベースのテーブルにSQLでレコードを追加する方法

$
0
0
insert

photo credit: eltpics Insert card via photopin (license)

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

GASからJDBCサービスを使ってCloud SQLのデータベースにアクセスする方法をシリーズでお伝えしています。

前回の記事はこちら。

GCPのCloud SQLデータベースにSQLでテーブルを作成する方法
GASからJDBCサービスを使ってCloud SQLのデータベースにアクセスする方法をシリーズでお伝えしています。今回は、GCPのCloud SQLデータベースにSQLでテーブルを作成する方法です。

GCPのCloud SQLデータベース内にSQLでテーブルを作成する方法をお伝えしました。

今回は、続いてその作成したテーブルのレコードを追加していきます。

ということで、GCPのCloud SQLデータベースのテーブルにSQLでレコードを追加する方法です。

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

前回のおさらい

前回までのおさらいです。

最終目標としては、GASで使用するデータベースをCloud SQLで作りたいということでした。

Cloud SQLでデータベースを作る場合、階層構造としては、以下のような作りになるんですね。

GCPのプロジェクト配下にCloud SQLインスタンスを作成する
└Cloud SQL配下のインスタンスにデータベースを作成する
 └データベースにテーブルを作成する
  └テーブルにレコードを追加する

前回で、テーブルを作成するところまで終えましたね。

  • データベース名: guestBook
  • テーブル名: entries
  • カラム名: guestName、content、entryID

テーブル「entries」の主キーはentryIDで、整数のAUTO_INCREMENTにしたんでした。

今回はテーブルにレコードを追加するところを進めていきますね。

INSERT文でデータを追加する

MySQLにログインしていれば、SQLを使ってテーブルにレコードを追加するのも、お茶の子さいさいです。

テーブルにレコードを追加するには、INSERT文を使います。

INSERT INTO テーブル名 (カラム名1, カラム名2, …) VALUES (値1, 値2, …);

カラム名の数と値の数は一致している必要があります。

また、カラム名と値の組み合わせを省略した場合は、デフォルト値が採用されます。

では、試しに以下の2つのSQLを実行して、2つのレコードを追加してみましょう。

INSERT INTO entries (guestName, content) values (“first guest”, “I got here!”);
INSERT INTO entries (guestName, content) values (“second guest”, “Me too!”);

カラムentryIDは省略してレコードの追加を行いましたが、「AUTO_INCREMENT」なので整数の順次+1されて追加されるはずです。

SELECT文でテーブルのデータを取り出す

では、実際にレコードを追加できたか確認していきましょう。

テーブルのレコードを取り出すにはSELECT文を使います。

最も基本的な書式は以下のようになります。

SELECT カラム1, カラム2, … FROM テーブル名;

これで、指定したテーブルから、指定したカラム名のカラムのみを取り出します。

ただ、すべてのカラムについて取り出したいのであれば、「*」記号を使って、以下のように簡潔に記述することもできます。

SELECT * FROM テーブル名;

ですから、今回の場合は、以下のようにすればテーブル「entries」のすべてのデータを取り出せるわけですね。

SELECT * FROM entries;

SQLを実行して確認してみましょう。

SQLでテーブルのすべてのデータを取り出す

バッチリ表示されました。

SELECT文は他にも条件での絞り込みや、並べ替え、グループ分けなどもできます。

当ブログでも必要に応じて初回していきますね。

まとめ

以上、GCPのCloud SQLデータベースのテーブルにSQLでレコードを追加する方法をお伝えしました。

SQLでよく使うであろうINSERT文とSELECT文について紹介しました。

少しSQLでに慣れてきたところで、次回はいよいよGASからCloud SQLのデータベースを操作していきましょう。

どうぞお楽しみに!

連載目次:GASのJDBCサービスでCloud SQLのDBを操作する

GASのデータベースの多くはスプレッドシートを使用しますが、ちゃんとしたデータベースを使用したい場合があります。そこで、JBDCサービスを使ってCloud SQLを使用する方法をシリーズでお伝えしていきます。
  1. GASのデータベースとして、なぜCloud SQLが有効なのか?その概要とメリット
  2. GASでデータベースとして使用するCloud SQLインスタンスを作成する方法
  3. GCPのCloud Shellを使ってCloud SQLインスタンスに接続する方法
  4. GCPのCloud SQLインスタンスにSQL文でデータベースを作成する方法
  5. GCPのCloud SQLデータベースにSQLでテーブルを作成する方法

【エクセルVBA】リストボックスのRawSourceプロパティの値を変動させてみよう!

$
0
0
ユーザーフォーム,リストボックス,rowsource

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

ユーザーフォームを作って、使ってみることを目標に、連載記事でユーザーフォームのコントロールやメソッド、プロパティをご紹介しています。

前回の記事では、ユーザーフォームにリストボックスを追加する方法と、リストボックスのプロパティをいくつかご紹介しました。

【エクセルVBA】ユーザーフォームのリストボックスを使ってみよう!
エクセルのユーザーフォームでフォームを作って、使ってみることを目標に、連載記事でユーザーフォームのイベントやプロパティ、メソッドをご紹介しています。今回は、入力者に特定の値から選択させたいようなときに使える、リストボックスをフォームに追加する方法と、代表的なプロパティをご紹介しています。

今回は、前回ご紹介したリストボックスのRowSourceプロパティを、VBAで変更する方法をご紹介します!

前回までのおさらい

これまでの記事で作成したユーザーフォームがこちら。

前回記事では、画面下部の「生産地」というラベルの下に配置してあるリストボックスを追加して、「LitRegion」というオブジェクト名をつけたのでした。

今回は、こちらのリストボックスに表示する値を、プロパティシートを使わずに、VBAで変えてみようというわけです。

プロパティはVBAでも設定できる

これまでユーザーフォームのプロパティをいくつかご紹介してきました。

記事の中では、プロパティはプロパティシートで値を設定していましたが、実はVBAでもプロパティの値を設定することができるんです。

ということで、前回記事の中でご紹介した、リストボックスに表示する値を設定する、RowSourceプロパティをVBAで設定してみましょう!

RowSorceプロパティをVBAで設定する記述方法

まず、VBAでRowSourceプロパティを設定するには、以下のように記述します。
ListBoxオブジェクト.RowSourceプロパティ = ワークシートの範囲(文字列型)

例えば、ListRegionというオブジェクト名のリストボックスのRowSourceプロパティに、ワークシートのA1セルからA5セルの範囲を指定したい場合は、このように記述することになります。

ListRegion.RowSource = "$A1:$A5"

ユーザーフォームの入力値によってリストボックスに表示する値を変える

検索結果をRowSourceプロパティにセットするコード

RowSourceプロパティをVBAで設定できることをご紹介したところで、他のコントロールの値によってリストボックスに表示する値を変化させてみましょう。

こちらの表のA列からユーザーフォームのテキストボックスに入力された値を検索して、検索にヒットしたすべてのレコードのB列「生産地」の値をリストボックスに表示していきたいと思います。

ユーザーフォーム,リストボックス,ワークシート

コードはこちら。

Private Sub TextItem_AfterUpdate()
With ActiveSheet

    .Range("E:E").Clear

    Dim myRange As Range
    Dim rngSearch As Range

    Set myRange = .Range("A2:A13")
    Set rngSearch = myRange.Find(What:=TextItem.Value, LookAt:=xlPart)

    Dim i As Long
    i = 1

    If Not rngSearch Is Nothing Then
        .Cells(i, 5).Value = .Cells(rngSearch.Row, rngSearch.Column + 1).Value
        Do
            Set rngSearch = myRange.FindNext(rngSearch)
            If rngSearch Is Nothing Then
                Exit Do
            Else
                i = i + 1
                .Cells(i, 5).Value = .Cells(rngSearch.Row, rngSearch.Column + 1).Value
            End If
        Loop Until rngSearch.Row = myRange.Row + myRange.Rows.Count - 1
    Else
        .Cells(i, 5).Value = "該当なし"
    End If

    'リストボックスに検索結果の範囲をセット
    ListRegion.RowSource = .Range(.Cells(1, 5), .Cells(i, 5)).Address

    End With
End Sub

テキストボックスの値によってリストボックスの値を変動させたいので、テキストボックスのAfterUpdateイベントを使っています。

このコードの中でやっていることは、

  1. テキストボックスに入力された値をワークシートのA列から検索
  2. 検索にヒットしたレコードのB列の値を、ワークシートのE列に書き出し
  3. 検索が終わったらリストボックスのRowSourceプロパティに、E列に書き出した検索結果の範囲をセット

の3ステップです。

テキストボックスの入力値でリストボックスに表示する値を変える

では、上のコードを実際に動かしてみましょう。

まず、ユーザーフォームのテキストボックスに「りんご」と入力してみます。

ワークシートのB列に「りんご」は3レコード存在していますので、各レコードのB列にある、「青森」、「長野」、「岩手」の3つがリストボックスに表示されるはずです。

ユーザーフォーム,リストボックス,ワークシート,ハイライト

実際にテキストボックスに「りんご」と入力してみると…
ユーザーフォーム,リストボックス,テキストボックス,連動
この通り、「青森」、「長野」、「岩手」3つの値がリストボックスに表示されました!

注意点:RowSourceプロパティは文字型で指定する

注意が必要なのは、上のコードの31行目にある、RowSourceプロパティにワークシートの範囲をセットしているところです。

RangeオブジェクトのAddressプロパティを指定していますよね。

「範囲」なんだからRangeオブジェクトを指定しておけばいいんじゃないの?と、こんな風に記述してしまうかもしれません。

ListRegion.RowSource = .Range(.Cells(1, 5), .Cells(i, 5))

日本語で「範囲」と表現するので忘れてしまいがちですが、RowSourceプロパティには、「範囲を文字列で」指定します。

Rangeオブジェクトそのまま指定してしまうと、Range型をプロパティに指定してしまうことになります。

これではRowSourceプロパティに指定できる型とそもそも異なりますので、こんなエラーになってしまいます。

ユーザーフォーム,リストボックス,roesource,エラー
Rangeオブジェクトの範囲を指定したい場合は、Addressプロパティで文字列型の範囲を取得して、RowSourceプロパティに設定するようにしましょう。

ワークシート範囲以外をリストボックスに指定したい!

ここまで、リストボックスのRouwSourceプロパティをVBAで変更する方法をご紹介してきました。

結局リストボックスの値にはワークシート上の範囲しか指定できないということなの?と思ってしまわれるかもしれませんね。

いえいえ、ワークシートの範囲を使わなくてもリストボックスの値をセットする方法があるのです。

その方法については、次回記事でご紹介していきます。

最後に

今回は、リストボックスのrowSourceプロパティをVBAで設定する方法をご紹介しました。

プロパティシートでは、各コントロールの初期値としてプロパティの設定ができますが、「入力した値によって表示する値を変化させたい!」「入力した値でコントロールの大きさや色を変えたい!」というような場合には、プロパティシートは使えません。

そこで、今回のようにコントロールのプロパティをVBAで設定するようにすれば、より柔軟にコントロールを操作することができますね。

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

連載目次:【エクセルVBA】ユーザーフォームを使ってみよう!

ユーザーフォームは、ちょっとした画面なら作れてしまう、便利な機能です。

何となく敷居が高いように感じてしまいますが、順を追っていけば難しいことはありませんよ。

  1. 【エクセルVBA】ユーザーフォームを作ってみよう!VBEでフォームを挿入する方法
  2. 【エクセルVBA】Showメソッドでユーザーフォームをコマンドボタンから開いてみよう!
  3. 【エクセルVBA】コマンドボタンのClickイベントとUnloadステートメントでユーザーフォームを閉じる方法
  4. 【エクセルVBA】テキストボックスのプロパティで入力を便利にしよう
  5. 【エクセルVBA】テキストボックスでよく使う3つのイベントを使ってみよう
  6. 【エクセルVBA】Initializeイベントでワークシートの値をユーザーフォームの初期値にセットする
  7. 【エクセルVBA】AfterUpdateイベントでテキストボックス同士を連動させてみよう
  8. 【エクセルVBA】コマンドボタンのClickイベントでワークシートを更新してみよう

GASのJDBCサービスでCloud SQLデータベースに接続をする方法

$
0
0

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

GASからJDBCサービスを使ってCloud SQLのデータベースにアクセスする方法をシリーズでお伝えしています。

前回の記事はこちら。

GCPのCloud SQLデータベースのテーブルにSQLでレコードを追加する方法
GASからJDBCサービスを使ってCloud SQLのデータベースにアクセスする方法をシリーズでお伝えしています。今回は、GCPのCloud SQLデータベースのテーブルにSQLでレコードを追加する方法です。

Cloud SQLのデータベースにSQLでレコードを追加する方法をお伝えしました。

これで、GCPでのCloud SQLの準備と、SQLに馴染むのは十分かなと思いますので、いよいよGASからCloud SQLを操作していきたいと思います。

今回は、GASのJDBCサービスでCloud SQLデータベースに接続をする方法です。

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

前回のおさらい

これまで、以下のような手順で、データベースの準備を進めてきました。

GCPのプロジェクト配下にCloud SQLインスタンスを作成する
└Cloud SQL配下のインスタンスにデータベースを作成する
 └データベースにテーブルを作成する
  └テーブルにレコードを追加する

ここで、データベース名は「guestbook」、テーブル名は「entries」でした。

このデータベースにGASからアクセスしていきたいと思います。

JBDCサービスとは

外部のデータベースに接続する機能を提供するサービスとして、GASにはJBDCサービスが用意されています。

JBDCサービスはScript Servicesに含まれていますので、デフォルトで使用可能です。

「JBDC」…何のことやら、さっぱり予想がつきませんね、

これは「Java DataBase Connectivity」の略で、業界標準として「Javaによるプログラミング言語」と様々な種類のデータベースとの「接続」を提供するAPIです。

GASで提供されているJBDCサービスは、このAPIを利用して外部のデータベース接続を実現するものです。

詳しく知りたい方は、英語ですが、以下のドキュメントをそれぞれご覧ください。

Java SE Technologies - Database
This page contains information about Java Database Connectivity (JDBC) related to Java SE.
JDBC  |  Apps Script  |  Google Developers

GASからCloud SQLへの接続

このJBDCサービスですが、Cloud SQLのデータベースの接続については、専用のメソッドが用意されています。

その名もgetCloudSqlConnectionメソッドです。

Jbdc.getCloudSqlConnection(データベースURL, ユーザー名, パスワード)

このメソッドにより、データベースURLが示すデータベースに接続して、その接続を表すJdbcConnectionという種類のオブジェクトを返します。

データベースを操作する場合、この「接続」からスタートすることが多いので、覚えておくと良いかも知れません。

データベースURLの作り方

データベースURLですが、Cloud SQLでは以下のような作りになります。

jdbc:google:mysql://{インスタンス接続名}/{データベース名}

データベース名は今回の場合は「guestbook」という名前でしたね。

インスタンス接続名ですが、これはGCPのナビゲーションメニュー > 「SQL」の画面で、すぐに確認できます。

GCPでインスタンス接続名を確認する

何やら文字列と、リージョンと、インスタンス名がコロン記号「:」で結合された文字列です。

ユーザー名、パスワード

ユーザー名、パスワードは、Cloud SQLのインスタンス作成時に定めた「root」のものでも良いですし、GCPで新たなユーザーアカウントを追加することもできます。

GASからCloud SQLのデータベースに接続する

これで材料は揃いましたので、GASでCloud SQLのデータベースへの接続を試してみましょう。

コードはこちらです。

var connectionName = '*****データベース接続名*****'; //Instance_connection_name
var userName = '*****ユーザー名*****'; //user_name
var password = '*****パスワード*****'; //'user_password'
var databaseName = 'guestbook'; //database_name

var url = 'jdbc:google:mysql://' + connectionName + '/' + databaseName;

function readFromTable() {
  var connection = Jdbc.getCloudSqlConnection(url, userName, password);
  Logger.log(connection.getCatalog());

  connection.close();
}

(スクリプトとして、データベース接続名、ユーザー名、パスワードなどをベタ打ちするのはあまり望ましくないので、実際にはプロパティストアなどを用いてくださいね。)

実行すると、ログで以下のようにデータベース名の表示を確認できます。

GASでCloud SQLデータベースに接続してカタログをログ出力

どうやらきちんと接続できているようですね。

接続のカタログ名を取得する

10行目のgetCatalogメソッドですが、これはJbdcConnectionオブジェクトの「現在のカタログ名」を取得するものです。

JbdcConnectionオブジェクト.getCatalog()

カタログはデータベースの種類によって何を指すかが違うようですが、MySQLの場合はデータベースのことなので、つまり接続したデータベース名を返します。

データベース接続を閉じる

12行目のcloseメソッドは、接続を終了する命令です。

JbdcConnectionオブジェクト.close()

本来、スクリプトの実行が終了すると、JDBC接続は自動的に閉じるらしいのですが、GASの公式ドキュメントではcloseメソッドを明示的に使用することが推奨されています。

JDBC  |  Apps Script  |  Google Developers

Javaデータベース接続(JDBC) Java Database Connectivity(JDBC)APIは、Javaプログラミング言語と、SQLデータベースやスプレッドシートやフラットファイルなどのその他の表形式データソースとの幅広いデータベース間のデータベースに依存しない接続の業界標準です。 JDBC APIは、SQLベースのデータベースアクセス用の呼び出しレベルAPIを提供します。 JDBCテクノロジを使用すると、Javaプログラミング言語を使用して、エンタープライズデータへのアクセスを必要とするアプリケーションの「Write Once、Run Anywhere」機能を活用できます。 JDBCテクノロジー対応のドライバーを使用すると、異種環境でもすべての企業データを接続できます。

まとめ

以上、GASのJDBCサービスでCloud SQLデータベースに接続をする方法をお伝えしました。

データベースURLさえ作れれば、簡単に接続ができますね。

次回、接続したデータベースを実際に操作していきます。

どうぞお楽しみに!

連載目次:GASのJDBCサービスでCloud SQLのDBを操作する

GASのデータベースの多くはスプレッドシートを使用しますが、ちゃんとしたデータベースを使用したい場合があります。そこで、JBDCサービスを使ってCloud SQLを使用する方法をシリーズでお伝えしていきます。
  1. GASのデータベースとして、なぜCloud SQLが有効なのか?その概要とメリット
  2. GASでデータベースとして使用するCloud SQLインスタンスを作成する方法
  3. GCPのCloud Shellを使ってCloud SQLインスタンスに接続する方法
  4. GCPのCloud SQLインスタンスにSQL文でデータベースを作成する方法
  5. GCPのCloud SQLデータベースにSQLでテーブルを作成する方法
  6. GCPのCloud SQLデータベースのテーブルにSQLでレコードを追加する方法

GASのJDBCサービスでCloud SQLにSQLステートメントを実行する方法

$
0
0
execute

photo credit: Marcin Wichary Execute via photopin (license)

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

GASからJDBCサービスを使ってCloud SQLのデータベースにアクセスする方法をシリーズでお伝えしています。

前回の記事はこちら。

GASのJDBCサービスでCloud SQLデータベースに接続をする方法
GASからJDBCサービスを使ってCloud SQLのデータベースにアクセスする方法をシリーズでお伝えしています。今回は、実際にJDBCサービスでデータベースに接続をして、その接続を確認していきます。

GASのJDBCサービスと、それによるCloud SQLのデータベースへの接続についてお伝えしました。

ただ、まだデータベースに接続しただけで、データベースの操作をしたわけではありませんでした。

今回は、データベースの操作をすべく、接続したデータベースに対してSQLステートメントを実行する方法をお伝えしていきます。

GASのJDBCサービスでCloud SQLにSQLステートメントを実行する方法です。

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

前回のおさらい

前回のコードはこちらです。

実行すると、指定のデータベースに接続し、「カタログ名」(MySQLの場合はデータベース名)がログで確認できます。

var connectionName = '*****データベース接続名*****'; //Instance_connection_name
var userName = '*****ユーザー名*****'; //user_name
var password = '*****パスワード*****'; //'user_password'
var databaseName = 'guestbook'; //database_name

var url = 'jdbc:google:mysql://' + connectionName + '/' + databaseName;

function readFromTable() {
  var connection = Jdbc.getCloudSqlConnection(url, userName, password);
  Logger.log(connection.getCatalog());

  connection.close();
}

データベース接続名は、GCPのCloud SQLを開けば取得可能です。

あとは、データベース名(今回のシリーズでは「guestbook」)、Cloud SQLインスタンスで設定したユーザー名とパスワードです。

さて、データベースの接続が完了しました。

JBDCサービスでは、接続したデータベースに対してSQLのステートメントで操作することができますので、以降でその方法を見ていきましょう。

JdbcStatementオブジェクトを作成する

SQLのステートメントを操作する役割を果たすのが、JdbcStatementオブジェクトです。

データベースへの接続を表すJbdcConnectionオブジェクトに対して、createStatementメソッドを使うことでJdbcStatementオブジェクトを作成することができます。

JbdcConnectionオブジェクト.createStatement()

ですから、以下のようにするわけですね。

var statement = connection.createStatement();

SQLステートメントを実行する

続いて、JdbcStatementオブジェクトを使って、SQLステートメントを実行します。

その役割を果たすのが、executeQueryメソッドです。

JdbcStatementオブジェクト.executeQuery(SQL)

引数に、SQLを文字列として指定すると、データベースに対してそのSQLを実行します。

この命令として渡すSQLを「クエリ」と言ったりしますね。なので、executeQueryメソッドなのですね。

なお、戻り値はそのSQLの実行結果を表すJdbcResultSetオブジェクトを返します。

例えば、以下のようにすることで、現在のデータベースのテーブル「entries」のすべてのレコードを取り出すことができます。

var results = statement.executeQuery('SELECT * FROM entries');

このSQLはSELECT文ですが、他のSQL文を使えば、executeQueryメソッドだけでレコードの追加、削除、更新などさまざまな操作を行うことができます。

便利っすね!

JdbcResultSetオブジェクト・JdbcStatementオブジェクトを閉じる

JdbcResultSetオブジェクトおよびJdbcStatementオブジェクトは、スクリプト終了後にJbdcConnectionオブジェクトと同様、自動で閉じるとされています。

ただ、これらも明示的に閉じる操作をしたほうが良いと推奨されているので、以下closeメソッドでそれぞれ閉じるようにしましょう。

JdbcResultSetオブジェクト.close()
JdbcStatementオブジェクト.close()
JDBC  |  Apps Script  |  Google Developers

接続したデータベースにクエリを実行するコード

では、これまでのまとめです。

まとめると以下のコードのようになります。

var connectionName = '*****データベース接続名*****'; //Instance_connection_name
var userName = '*****ユーザー名*****'; //user_name
var password = '*****パスワード*****'; //'user_password'
var databaseName = 'guestbook'; //database_name

var url = 'jdbc:google:mysql://' + connectionName + '/' + databaseName;

function readFromTable() {
  var connection = Jdbc.getCloudSqlConnection(url, userName, password);
  var statement = connection.createStatement();
  var results = statement.executeQuery('SELECT * FROM entries'); 
  
  //結果を取り出す処理

  results.close();
  statement.close();
  connection.close();
}

結果を取り出す処理については、次回で紹介していきます。

まとめ

以上、GASのJDBCサービスでCloud SQLにSQLステートメントを実行する方法をお伝えしました。

使用するオブジェクトが多くて面倒に思えるかもしれませんが、JbdcConnectionオブジェクトオブジェクトとJdbcStatementオブジェクトについて、それぞれの役割を確認しておいてください。

JdbcResultSetオブジェクトについては、次回その中身を解き明かしていきます。

どうぞお楽しみに!

連載目次:GASのJDBCサービスでCloud SQLのDBを操作する

GASのデータベースの多くはスプレッドシートを使用しますが、ちゃんとしたデータベースを使用したい場合があります。そこで、JBDCサービスを使ってCloud SQLを使用する方法をシリーズでお伝えしていきます。
  1. GASのデータベースとして、なぜCloud SQLが有効なのか?その概要とメリット
  2. GASでデータベースとして使用するCloud SQLインスタンスを作成する方法
  3. GCPのCloud Shellを使ってCloud SQLインスタンスに接続する方法
  4. GCPのCloud SQLインスタンスにSQL文でデータベースを作成する方法
  5. GCPのCloud SQLデータベースにSQLでテーブルを作成する方法
  6. GCPのCloud SQLデータベースのテーブルにSQLでレコードを追加する方法
  7. GASのJDBCサービスでCloud SQLデータベースに接続をする方法

GASのJDBCサービスでCloud SQLにクエリを実行した結果を取り出す方法

$
0
0
select

photo credit: JohnSeb DSCN8475 via photopin (license)

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

GASからJDBCサービスを使ってCloud SQLのデータベースにアクセスする方法をシリーズでお伝えしています。

前回の記事はこちら。

GASのJDBCサービスでCloud SQLデータベースにクエリを実行する方法
GASからJDBCサービスを使ってCloud SQLのデータベースにアクセスする方法をシリーズでお伝えしています。今回は、GASのJDBCサービスでCloud SQLデータベースにクエリを実行する方法です。

GASのJDBCサービスを使ってCloud SQLのデータベースに対してクエリを実行する方法をお伝えしました。

ただ、たぶん実行はできたのですが、その結果が確認できていませんでしたね。

ということで、今回はGASのJDBCサービスでCloud SQLにクエリを実行した結果を取り出す方法です。

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

前回のおさらい

前回作成したコードはこちらです。

var connectionName = '*****データベース接続名*****'; //Instance_connection_name
var userName = '*****ユーザー名*****'; //user_name
var password = '*****パスワード*****'; //'user_password'
var databaseName = 'guestbook'; //database_name

var url = 'jdbc:google:mysql://' + connectionName + '/' + databaseName;

function readFromTable() {
  var connection = Jdbc.getCloudSqlConnection(url, userName, password);
  var statement = connection.createStatement();
  var results = statement.executeQuery('SELECT * FROM entries'); 
  
  //結果を取り出す処理

  results.close();
  statement.close();
  connection.close();
}

データベースURLを生成して、getCloudSqlConnectionメソッドで接続します。

続いて、SQLのクエリ「SELECT * FROM entries」を実行するというものですね。

その実行結果が、変数resultsに格納されるわけですが、その中身を取り出す処理はまだ作成していませんでした。

ということで、SQLクエリを実行した結果を取り出す処理を作成していきます。

JdbcResultSetオブジェクトとは

さて、11行目のexecuteQueryメソッドにより、変数resultsにはクエリを実行した結果であるJdbcResultSetオブジェクトが格納されます。

JdbcResultSetオブジェクトはテーブルのような構造のオブジェクトになっていて、以下のような動作をします。

  1. 「現在のレコード」を表すカーソルを持っている
  2. 最初のカーソルの位置は、最初のレコードの前を指し示している
  3. nextメソッドを実行するたびに、次のレコードにカーソルが移動する
  4. 現在のレコードに対して、getStringメソッドや、getIntメソッドで、指定のカラムの値を取リ出すことができる
  5. 最終レコードの次の行にカーソルが移動したとき、nextメソッドはfalseを返す

以下でひとつひとつ詳しく見ていきましょう。

nextメソッドでJdbcResultSetオブジェクトをループする

JdbcResultSetオブジェクトのnextメソッドは、カーソルを次のレコードへ移動します。

JdbcResultSetオブジェクト.next()

初期状態でカーソルは最初のレコードの前にありますので、nextメソッドを1回実行したときに、1つ目のレコードを指し示します。

nextメソッドで移動したレコードが有効であれば戻り値としてtrueを返します。

最終レコードのときにnextメソッドを実行すると、そこにはレコードはもうありませんので、戻り値としてfalseを返します。

これらの特性を利用して、JdbcResultSetオブジェクトが表すテーブルに対して、以下のようにwhile文でループ処理を構成できます。

while (results.next()) {
  //処理
}

現在のレコードからデータを取り出す

あとは、ループの中で、現在カーソルがあるレコードについて、データを取り出していけばよいわけですね。

現在カーソルがあるレコードについて、指定のカラムのデータを取り出すには、getStringメソッドや、getIntメソッドを使用します。

JdbcResultSetオブジェクト.getString(カラム名)
JdbcResultSetオブジェクト.getInt(カラム名)

いずれも、カラム名で指定したカラムのデータを取り出しますが、getStringメソッドなら文字列で、getIntメソッドなら整数で取り出します。

他にもデータ型に応じたメソッドが用意されているので、必要に応じて調べてみてください。

Class JdbcResultSet  |  Apps Script  |  Google Developers

つまり、以下のようにすれば、JdbcResultSetオブジェクトの現在のレコードについて、カラムentryIDの値を整数で、カラムguestNameとcontentの値を文字列で取得し、ログに出力できます。

while (results.next()) {
  var entryID = results.getInt('entryID');
  var guestName = results.getString('guestName');
  var content = results.getString('content');
    
  Logger.log('%s \t %s \t %s', entryID, guestName, content);

}

クエリで取り出したテーブルを表示する

まとめのコードは以下のようになります。

では、実行して動作を確認しましょう。

var connectionName = '*****データベース接続名*****'; //Instance_connection_name
var userName = '*****ユーザー名*****'; //user_name
var password = '*****パスワード*****'; //'user_password'
var databaseName = 'guestbook'; //database_name

var url = 'jdbc:google:mysql://' + connectionName + '/' + databaseName;

function readFromTable() {
  var connection = Jdbc.getCloudSqlConnection(url, userName, password);
  var statement = connection.createStatement();
  var results = statement.executeQuery('SELECT * FROM entries'); 
  
  while (results.next()) {
    var entryID = results.getInt('entryID');
    var guestName = results.getString('guestName');
    var content = results.getString('content');
    
    Logger.log('%s \t %s \t %s', entryID, guestName, content);
  }

  results.close();
  statement.close();
  connection.close();
}

実行してログを確認すると、以下のように各レコードのデータを取り出すことができます。

GASのJDBCサービスでクエリを実行した結果を出力

まとめ

以上、GASのJDBCサービスでCloud SQLにクエリを実行した結果を取り出す方法をお伝えしました。

SELECT文では、条件や並び替えなど、いろいろなパターンのクエリを作れます、

今回のスクリプトをベースにそれらどんなパターンでも応用できます。

さて、次回以降ですが、SELECT文ではなく、他のSQLを実行していく方法を見ていきましょう。

どうぞお楽しみに!

連載目次:GASのJDBCサービスでCloud SQLのDBを操作する

GASのデータベースの多くはスプレッドシートを使用しますが、ちゃんとしたデータベースを使用したい場合があります。そこで、JBDCサービスを使ってCloud SQLを使用する方法をシリーズでお伝えしていきます。
  1. GASのデータベースとして、なぜCloud SQLが有効なのか?その概要とメリット
  2. GASでデータベースとして使用するCloud SQLインスタンスを作成する方法
  3. GCPのCloud Shellを使ってCloud SQLインスタンスに接続する方法
  4. GCPのCloud SQLインスタンスにSQL文でデータベースを作成する方法
  5. GCPのCloud SQLデータベースにSQLでテーブルを作成する方法
  6. GCPのCloud SQLデータベースのテーブルにSQLでレコードを追加する方法
  7. GASのJDBCサービスでCloud SQLデータベースに接続をする方法
  8. GASのJDBCサービスでCloud SQLデータベースにクエリを実行する方法
  9. GASのJDBCサービスでCloud SQLにクエリを実行した結果を取り出す方法
Viewing all 2078 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>