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

プログラミングの学び方について知っておいてほしいこと

$
0
0
study

photo credit: r.nial.bradshaw 18027-homework-math-daily.jpg via photopin (license)

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

ノンプログラマーにとって、プログラミングの「学び方」は特に重要です。

というのも、そもそも学ぶ時間が少ないですし、後述しますがプログラミングの学習には多大な学習時間を要するからです。

本を買えばいいだろう、ネットを見ながら勉強すればいいだろう…備えなしにむやみに始めてしまうと、「自分には向いてないな」と挫折してしまう可能性も…

そんなことにならないためにも、うまく学ぶ方法を身につける必要があります。

ということで、ノンプログラマーがプログラミング学習を上手に進めるための前提知識と方法についてお伝えしていきます。

※この記事はコミュニティ「ノンプログラマーのためのスキルアップ研究会」定例会Vol.7「プログラミングの学び方について知っておいてほしいこと」の内容の一部を加筆修正して記事にしたものです。セミナーからの抜粋動画もありますので、合わせてご参考くださいね。当日の様子は以下のツイートまとめもご覧くださいませ。

ノンプロ研定例会Vol.7 「プログラミングの学び方について知っておいてほしいこと」
ひとこと「プログラミングを学ぶ」といっても、書籍、Webサイト、オンラインサービス、セミナー…たくさんの種類がありますよね。今の自分にとって、また目指すゴールを考えたときに、どの手法が良いのか…な..

なぜ「学び方」が重要なのか

結論から言ってしまいます。

もう、我々知識労働者は、生涯学び続けないといけないからです。

ノンプロ研の第1回目の定例会でもお話したのですが、プログラミングを学ぶには180~300時間程度が必要と言われています。

プログラミングを習得するためには何時間の学びが必要なのか #ノンプロ研
プログラミングを習得するには、どれだけの時間が必要なのでしょうか?今回はプログラミングを習得するためには何時間の学びが必要なのか?を明らかにしつつ、実際にそのための時間を捻出し、その習慣を作る方法を考えていきます。

上手な学び方ができていれば180時間である程度モノにできるかも知れませんが、そうでなければ同じ成果を得るのに300時間かかってしまうかも知れません。

現代のビジネスマンは忙しいのです。効率よく学ぶかどうかは、死活問題です。

別の視点ですが、プログラミングに携わる人達は、どのレベルにあったとしてもそれぞれの「リスク」と向き合う必要が出てきます。

それをが以下の表です。

ランク スキルレベル 実務への活用 最大のリスク
Beginners 初級 できない 挫折
Wanderers 中級 できる 停滞
Pioneers 上級 できる 技術の衰退

ビギナーは前述の通り、モノにするまでは学びが実務に活かせないので、それまでの間にモチベーションの低下や習慣化の失敗などがあると、プログラミング学習に関して「挫折」をするというリスクを抱えています。

中級の人は、さまよっているということでWonderersと命名していますが、実務で使い始めてはいつつも、やればやるほど複雑な迷路に迷い込むような、そんな状況がリスクとしてあります。

上級の人たちは、どんどん開拓をしていけますが、その技術自体が衰退するリスクがあるので、別の技術領域にアンテナを張って学習をする必要があります。

ということで、プログラミングに携わる人たちは、それぞれ大きなリスクを抱えています。

そして、そのリスクを回避する唯一の方法は学び続けること、したがって学び方が上手かどうかは重要ということになります。

プログラミングの学習にはパターンがある

道のりはだいたい決まっている

お伝えしたとおり、プログラミングの学習は数百時間を要する、長い道のりになります。

多くの人は、その道のりがどういうものなのか…わからずに学習をはじめてしまうのですが、実はプログラミング学習がどういう道のりかは事前にある程度予想をすることができます。

というのも、プログラミングの学習で学ぶことというのは、言語問わずだいたい同じ流れで、以下のようなものになります。

  1. 準備
  2. 基本仕様・構文
  3. 制御構文
  4. 関数・クラスの作り方
  5. 関数・クラスの使い方

それで、1から4までは「積み重ね」で、だいたい1から順番に4までを階段を登るようにマスターしていく必要があります。

その間の多くの期間はつまりBeginnersなわけで、実務に使えないので、なるべく早い段階で4あたりまで到達する必要があります。

5の「関数・クラスの使い方」だけは、他の項目とはちょっと異質で「アラカルト」なんですね。つまり、ほしいやつだけチョイスして身につけていくような種類のものになります。

例えば、VBAで言えば、基本的なVBA関数と、Excelライブラリのオブジェクトの使い方がわかれば、実務で使うには十分のスキルを身につけることができます。

必要に応じて、PowerPointライブラリやScriptingライブラリの使い方を学ぶ人もいますが、全ての人に必要というわけではありません。


こういったことを事前にイメージできていると、学習に必要な時間だけでなく、過程のイメージもできますし、自分にとって必要な学習の選別もきくようになったりします。

プログラミングはパターンで学ぶ

ある程度の学習が進み、Wanderersの段階になると、アラカルトをどんどん増やしていくフェイズになります。

しかし、すべてのオブジェクトやそのメンバーの使い方を四角四面にマスターしようとしたらきりがありません。

なぜなら、例えば以下のように、クラスやそのメンバーの数は膨大だからです。

  • VBAのExcelライブラリのクラスの数:300程度
  • GASのSpreadsheetサービスのメンバー数:317(※調査時点)

こんな数のものを、全部適当に仕入れていったら、脳みその中は散らかります。

例えば、VBAのメンバーは、表向きは関数、メソッド、プロパティといったふうに分類されています。それぞれ、何ものなのでしょうか?

また、メンバーはSub・Function・Propertyの3種類のプロシージャで作られています。これらのプロシージャはどういう役割を持つものでしょうか?

このように、プログラム言語には分類や体系があります。

スキルを高めていくそのいずれかのタイミングで、その分類や体系をきちんと理解し、脳みその中の知識を、上手に仕分け管理する能力が必要になります。

単純にインプットするのではなく、うまくパターン化して整理しながらインプットしていく能力が求められるのです。

写経のススメ

さて、以上のことがわかれば、それをベースとして、それぞれのレベルや学習環境、目的に合わせて学習法をセレクトしていけば良いということになります。

今は、以下のように、たくさんの学習法が提供されているので、たいへん恵まれていますよね。

  • 書籍(電子書籍含む)
  • ネット記事
  • オンラインサービス
  • 動画サービス
  • 研修

いずれの学習においても、私がオススメしたい学習の進め方は写経です。

写経とは「サンプルプログラムを書き写して、実行してみること」です。

コツとしては、「無心」としてやるのは駄目で、コードを確実に「理解」していることを確認しながら進める必要があります。

また、小さい単位で細かく実行しながら進めるということもポイントです。

限りある学習時間、最大限有効に活用くださいね。

まとめ


「学び方」の学び方はとても重要ですね…。

というのも、おそらく、時代としては、一生学び続けないと、うまく稼げない時代に突入していっていると考えていまして、それはプログラミングに限らずです。

ぜひ、うまい学び方を身に着けて、上手に価値提供をしていきたいものです。

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

コミュニティ「ノンプログラマーのためのスキルアップ研究会」では、毎月1回、学びの質やモチベーションを高めるための定例会を開催していますので、こちらで過去のレポートをお送りしています。 また、定例会のプレゼン動画は以下のショップにて完全版を販売していきますので、こちらもどうぞご活用くださいませ。 BASEショップ「ノンプログラマーのためのスキルアップ研究会」

イベント「RPA勉強&LT会!RPALT vol3」に参加してRPAとコミュニティについて学んで来たぞ

$
0
0

RPA勉強&LT会のMitzさん

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

先日、「RPA勉強&LT会!RPALT vol3@ウイングアーク1st」というイベントに参加してきました!

その名の通りRPAの勉強会で、業界初である完全なユーザーコミュニティ「RPA Community」によって運営されています。

【増席】RPA勉強&LT会!RPALT vol3@ウイングアーク1st (2018/07/13 19:00〜)
## 業界初の完全なユーザー主体のRPAコミュニティ「RPA Community」が主催するRPA勉強会&LT会です!大好評を受けての第3回目! ## 7/13追記 本日受付場所:地下鉄 六本木一丁目から直結した1階ゲート前にイベント受付を設置し入館証をお渡しします。 道路に面した車寄せのある場所ではなく地下鉄か...

まあ、ご覧の通り、素晴らしい会場!そして、200人を軽く超えるたくさんの参加者!

「IT×働き方」をテーマにしつつRPAビギナーで、かつChatWork Café、ノンプロ研という2つのコミュニティの運営に携わっている私としては、気になりすぎる本イベント。

参加せざるを得ないわけです。

ということで、「RPA勉強&LT会!RPALT vol3@ウイングアーク1st」のイベントレポート、行ってみましょう!

あ、ちなみに早速ツイートまとめも上がっていましたので、こちらも合わせてご覧くださいね。

金曜夜なので飲みながら楽しくRPAを学ぶ最高のイベント!?RPA勉強会・RPALT vol.3開催!
RPA勉強&LT会!RPALT vol3@ウイングアーク1st超綺麗でオシャレな会場開始前から乾杯スタート懇親会ではケンタのツイスター160本RPAから業務改善・働き方改革まで様々なテーマで学ぶ

本イベント参加の目的

RPA

今、IT系のニュース記事では頻繁に話題に上がっていますよね。

また、最近では税理士さん業界では、RPAを導入したり、研究したりが活発になっているのは、皆さんのブログからも見て取れます。

我らがノンプロ研のメガネ先生 (@khtax16)も積極的に紹介されています。

RPA・RDAの衝撃 ロボットがあなたの手となる日(税理士業界向け)
2018年3月17日、税理士業界に激震が走った。 いや激震が走ったのは一部の人間かもしれないが、少なくとも私の心の震度は立っていられぬほどだった。 生まれたての子鹿かと思うほどに震えた。 井ノ上陽一さんがこんな記事を書いたからである。 ⇒『税務申告代行業は、AI・ロボットによりなくなるかどうか試してみた』 以前とある...

私、タカハシにとってRPAは当然ながら気になる存在ではあったのですが、実は未開の地。

RPAが実際にビジネスの現場でどのように推進、活用されているのか、これから業界としてはどのような方向に進むのか、ビジネス現場でどのようなポジションを取るようになるのか、…気になることがいっぱいすぎる…!

そして、私自身も足を踏み込むべきだろうな~と思っていた矢先での本イベント。

実は、今回参加した目的はもうひとつ。

コミュニティ「RPA Community」の運営には、ChatWork Caféの運営をお手伝いいただいている、Mitzさん(@CharaDenMitzがいらっしゃるのですが、にじみ出るだけでもそのコミュニティ運営術が素晴らしいんです。

今回のイベントも軽く200人超えですし。

ですから、今回はMitzさんの素晴らしいコミュニティ運営術を盗むチャンスでもありました。

RPAについて学んだこと思ったこと

さて、イベントに参加してみて、いくつかのセミナーとLTを拝聴して、RPAのド素人が学んだこと思ったことについてお伝えします。

RPAでロボットを作るにはそれなりのスキルが必要

まず、RPAのロボットを作るには、明確にスキルが必要ということです。

技術的には、プログラミングほどではないにしても、「コーディングがいらないプログラミング」というレベルのスキルが必要。

なので、変数とか型、条件分岐、反復といったプログラミング基礎知識と、それを組み立てて実現する技術が必要です。

もうひとつ別軸のスキルとしては、業務を理解するスキルが必要ということです。

当然ながら、人の作業をロボット化していくわけですから、元の作業手順や趣旨が理解できていないと作ることができません。この点は、プログラミングと一緒ですね。

このあたりについては一戸さんのセミナープレゼンも参考になると思います。

いくところまでいくと習得の難易度はプログラミングと変わらない?

正直、あまり理解ができなかったのですが、いくつかのLTではかなり技術的に高度なお話もありました。

デスクトップで操作する範囲では、エクセルマクロと同じような感覚なのですが、クラウドまたはオンプレミスサーバー上からコントロールするようなことも可能になります。

その場合は、より高度な知識とスキルが必要になるので、「専門家」が必要になってくるように思います。

勝手なイメージとして、ビジネス部門の人がスキルを身に着けてロボット化をしていくという導入シナリオを想定していたのですが、他のプレゼンでも「専任で」というお話もありました。

個人的には、全てのビジネスマンにとって身につけると良いスキルなのか、それとも限られた人材が持つべきスキルなのか、このあたりの見極めをしたいと感じたところです。

コミュニティ運営について学んだこと思ったこと

さて、次はコミュニティ運営について学んだこと思ったことです。

たくさんの学びがありました。

アンケートMentimeter

コミュニティイベントでいうと、参加者の参加している感をいかに出せるかがすごく大事ということになります。

例えば、ツイートはその最も手軽な方法の一つで、そこを入り口にどんどん入り込んでいただけると、ブログやSNSでのアウトプットや、次回のLTの登壇といったより高い貢献に参加いただくことが可能です。

ただ、Mitzさんいわく、ツイートは最初のハードルとしては高すぎで、もっと手軽に参加意識を味わえるものを用意していくといいよ、ということで紹介されていたのが「アンケート」です。

そのアンケートのツールとして紹介されていたのが、こちらの「Mentimeter」です。

Interactive presentation software
Create fun and interactive presentations for your meeting, event, conference or classroom. Mentimeter is a free, easy-to-use software that you can use online.

これをどんなふうに使っているのかな~というのが見たかったのですが。見られました。

RPA勉強&LT会のアンケートmentiと駄菓子

まず、最初にQRコードとmentimeterの回答ページにアクセスするためのNoを印刷して渡しておきます。

あとはスマホで回答いただくと、リアルタイムに集計ページに反映されるので、それをスライドに映すという方法です。

開場から開演までの間に、それをネタにトークを繰り広げたり、次回のネタ探しに使ったり、ほんと巧みでした。

あと、私のような気の弱そうな輩には「今後、チャットワークとRPAで何かLTお願いします」というソフトプッシュを確実に…やらざるを得ないじゃないですか。巧みですわ。

スポンサー…!

今回、ウェルカムから懇親会までドリンク、駄菓子、ツイスター(160本…!)とたいへん充実した飲食が提供されていました。

あと、もちろん会場。200人規模の会場が必要です。

forkwellさん、ウィングアーク1stさんという企業スポンサーが支えてくださっているとのこと。

RPA勉強&LT会vol3のウィングアーク1stさん提供の会場

素晴らしい…!

ChatWork Caféにせよ、ノンプロ研にせよ、今は規模が小さいので良いですが、大きくなってきたら会場などは考える必要が出てきますので、後々頭が痛い話になりそうです。

駄菓子、ツイスターに関しては、アイデアストックとしてありがたく頂戴します。

何よりもコミュニティの目的が素晴らしい

冒頭、オープニングでMitzさんがお話されていた内容です。

以下スライド見てください。


特に9ページ目。

削減できるのは人の手間・作業時間。
その分増やせるのは人の充実・幸せ。

そして、RPAを軸にしつつも、業務効率化、働き方改革と視野を広げて学ぶ、そして幸せになるというのがコミュニティの目的ということになります。

…共感しまくりなんですけど。

まとめ

ということで、「RPA勉強&LT会!RPALT vol3@ウイングアーク1st」大変学びの多いイベントでした。

RPAに関しては、もっと予備知識が必要なのは確実なので、日々の学びに加えていきます。

まずは、UiPathアカデミー。

UiPathアカデミー | 無償オンライントレーニング
UiPath(ユーアイパス) RPA Academyへようこそ!RPAの知識をオンラインにて無償で習得することができます。

無料で30~40時間の学習コンテンツを提供されているので、見てみましょう。

あと、LT登壇されていたtutorialさんのブログも見てみます。

UiPathではじめるRPA入門 (1) 〜 概要編
このシリーズでは、RPAソフトウェアの使い方を概説します。選定したソフトウェアは、無料で使えるコミュニティエディションを提供しているUiPathです。UiPathでは、UiPath Academyという無料のEラーニングを提供していますが、コースが長くちょっと試すという分にはかなりの覚悟が必要です。 そこで、一日か二日...

実は、近々8/10に「RPA勉強&LT会!RPALT vol4 with Tech Night!@ソフトバンク」が開催されます。

RPA勉強&LT会!RPALT vol4 with Tech Night!@ソフトバンク (2018/08/10 19:00〜)
## 業界初の完全なユーザー主体のRPAコミュニティ「RPA Community」が主催するRPA勉強会&LT会です!大好評を受けての第4回目! ## 今回は「Tech Night @Shiodome」とのコラボ開催! ### まず最初に一言 RPAユーザー同士でRPAを学び、情報を共有し、悩みを共有することで、...

すぐに埋まっちゃうので、ご興味ある方はお早めにどうぞ~!

GASでGoogleフォームを作成する最も簡単なスクリプト

$
0
0
application-form

photo credit: cavale shh via photopin (license)

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

イベントの申し込み受付や、アンケートなどを行いたいときに、Googleフォームは大変便利ですよね。

簡単な編集できちんとしたフォームが作れますし、なにせ無料でずっと使い続けることができます。

Google Apps Scriptでは、そのGoogleフォームも操作をすることもできます!

毎月のように似たようなイベントを開催している会社さん、定期的に似たようなアンケートを行っている会社さん、いらっしゃいますよね…?

毎回…

  1. GoogleドライブからGoogleフォームを新規作成して
  2. フォームのタイトルを変更して
  3. フォームの説明加えて
  4. 質問追加して

…って面倒ですよね。

コピーして作ればいいですが、もっとスマートなやり方があります。

GASを使えば、ちょちょっとスプレッドシートに必要事項入力して、実行一発でフォームを作れちゃいますよ。

ということで、今回から何回かのシリーズで、GASでGoogleフォームの作成ツールを作成していきます。

今回は、最初ということで、Googleフォームを作成する最も簡単なスクリプトを紹介していきます。

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

GASでGoogleフォームを作成する最も簡単なスクリプト

Googleフォームを作成するだけなら、なんとたった一行でOK。

では、そのスクリプトを紹介しましょう!

コチラです。

function createEventForm(){
  FormApp.create('もくもく会');
}

実行してみましょう。

初回は認証が必要ですが、それを終えるとGoogleドライブのマイドライブに以下のように「もくもく会」というフォームが作成されているはずです。

GASで作成したGoogleフォームはマイドライブに生成

ダブルクリックしてフォームを開くと、以下のようなフォームが生成されていることを確認することができます。

GASで作成したフォーム

なんて簡単なんでしょう!

グローバルオブジェクトFormAppとは

スクリプトを解説しますね。

まず、「FormApp」というワードが登場します。

GASではGoogleフォームを操作する機能を「Formsサービス」というサービスで提供しています。

FormAppはこのFormsサービスのグローバルオブジェクトです。

GASでFormsサービスを使って何らかの操作をする場合には、まずこのFormAppオブジェクトを経由するところからはじまります。

グローバルオブジェクトは、最も上位のオブジェクトとか、トップレベルのオブジェクトとも呼ばれますね。

createメソッドでフォームを作成する

そのFormAppオブジェクトに対して、createメソッドを使用しています。

その名の通り、フォームを生成するメソッドですね。

書式は以下の通り、引数にフォームのタイトルを文字列で指定します。

FormApp.create(タイトル)

後ほど活用しますが、createメソッドの戻り値は、生成したフォームを表すFormオブジェクトです。

生成したフォームに質問や説明などを設定、追加していくには、そのFormオブジェクトに対して行っていけばOKです。

スプレッドシートの内容からフォームを生成する

setDescriptionメソッドでフォームの説明を設定する

さすがに素っ気ないので、説明くらい加えておきましょうか。

フォームの説明を設定するには、Formオブジェクトに対してsetDescriptionメソッドを使います。

書式はコチラです。

Formオブジェクト.setDescription(説明)

説明は文字列で指定します。

例えば、以下のようにすれば、フォームの説明も設定することができるわけですね。

function createEventForm(){
  var form = FormApp.create('もくもく会');
  form.setDescription('説明');
}

スプレッドシートのデータを元にフォームを生成する

ただ、イベントの日時やスケジュール、募集要項など、箇条書きや改行を駆使して入力したいので、スクリプト内にベタ打ちだと大変です。

ということで、スプレッドシートの入力を活用してフォームを作成しましょう。

例えば、以下のようなスプレッドシートです。

フォームを作成する元となるスプレッドシートのデータ

「イベント概要」というシートに、イベントタイトルとイベント概要(=説明)を記載しています。

このデータを元にフォームを作成するスクリプトがコチラです。ちなみに、スクリプトは上記スプレッドシートのコンテナバインドで作成してくださいね。

function createEventForm(){
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
  var values = spreadsheet.getSheetByName('イベント概要').getDataRange().getValues();
  var formTitle = values[0][1]; //タイトル
  var formDescription = values[1][1]; //概要

  var form = FormApp.create(formTitle);
  form.setDescription(formDescription);
}

実行すると、以下のようなフォームを作成することができます。

スプレッドシートのデータをもとに作成したフォーム

まとめ

以上、GASでGoogleフォームを作成する最も簡単なスクリプトについて解説をしました。

フォーム…作成するならたった一行、すごいですね。

スプレッドシートのデータを取得する部分に配列を使用していますが、このあたり詳しく知りたい方は、以下の記事もご参考ください。

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

次回は、作成したフォームの保存場所を指定する方法です。

どうぞお楽しみに!

連載目次:GASでGoogleフォームを一発で作成するツールを作る

イベントの申し込みやアンケートにとっても便利なGoogleフォーム。スプレッドシートの入力内容をもとに、一発でフォームを作成するツールを作っていきます。
  1. GASでGoogleフォームを作成する最も簡単なスクリプト

【エクセルVBA】エクセルVBAでOutlookを操作しよう!参照設定とOutlookアプリケーションオブジェクトの取得

$
0
0

vba,outlook,eyacatch

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

お仕事をしていると、色々な方にお知らせのメールを一斉送信する場面ってありますよね。

展示会のお知らせ、就活生への情報提供メール、新年のご挨拶や、業務担当者変更のお知らせ等々…

GmailやMicrosoft Outlook、Windows Live Mailなど便利なメーラーは沢山あれど、複数の送信先へ、メール本文の中の宛名も変えつつ一斉送信したいとなると、その機能が標準機能としてついているメーラーはなかなかありません。

更に、会社で使用するメーラーが指定されているために、他のメーラーには搭載されている機能が使えなかったり、一斉送信のスクリプトが使えなかったり…

「会社指定のメーラーはOutlookだけど、Gmailだったらスクリプト組めば、メールの本文を変えつつメール一斉送信できるのに…!」と歯ぎしりした方も世の中にはいらっしゃるのではないでしょうか。

でも、もしOutlookをお使いでしたら、一斉送信その他の操作がエクセルVBAからできるかもしれません。

ということで今回は、エクセルVBAからOutlookを操作する第一歩として、Microsoft Outlook Object Libraryの参照設定と、エクセルVBAでOutlookアプリケーションオブジェクトを取得する方法をご紹介していきます!

VBEでOutlook XX.X Object Libraryの参照設定をする

まず、エクセルVBAでOutlookを操作する準備として、VBEでMicrosoft Outlook Object Libraryの参照設定をしましょう。

VBEの画面を開いて、メニューから「ツール」>「参照設定」を選択していきます。

VBE,参照設定,メニュー

すると参照設定の画面が開くので、Microsoft Outlook XX.X Object Libraryにチェックを入れます。

(筆者の環境ではMicrosoft Outlook 16.0 Object Libraryとなっていますが、この数字の部分はお使いのPCによって異なるかもしれません。)

VBE,参照設定,Outlook

あとは「OK」ボタンをクリックすれば、参照設定完了です。

Outlookアプリケーションオブジェクトを取得する

参照設定ができたら、次はエクセルVBAからOutlookを操作できるように、Outlookアプリケーションオブジェクトを取得しましょう。

まずは、Outlookアプリケーションオブジェクト変数の宣言をします。

Dim オブジェクト名 As Outlook.Application

そして、宣言したオブジェクト型変数で、Outlookアプリケーションオブジェクトを取得しましょう。

記述はこちら。

Set オブジェクト名 = New Outlook.Application

実際のコードはこんな感じになります。

Dim objOutlook As Outlook.Application
Set objOutlook = New Outlook.Application

これで、エクセルVBAでOutlookを操作することができるようになります。

参照設定が使えない場合

Microsoft Outlook XX.X Object Libraryの参照設定が使えない場合は、Object型の変数と、CreateObject関数を使って記述することもできます。

Dim objOutlook As Object
Set objOutlook = CreateObject("Outlook.Application")

ただ、以前の記事でもお伝えした通り、参照設定を使用するとコーディングの時にクイックヒントが出てきてくれるので、記述が楽なのと、スペルミスをすることがありません。

参照設定を使わなくてもコーディングはできますが、余程の理由がない限りは参照設定を使う方が、個人的にはオススメです。

Outlookがインストールされていないとお話にならない

ここまでエクセルVBAからOutlookを操作する準備とアクセス方法をご紹介していますが、この方法でOutlookを操作するには前提条件があります。

当たり前ですがPC内にOutlookがインストールされていること

そもそも操作したいアプリケーションがPCにインストールされていないことにはお話になりませんので、OutlookがPC内にあることが大前提です。

最後に

今回はOutlookを操作するための準備として、Microsoft Outlook Object Libraryの参照設定と、エクセルVBAでOutlookアプリケーションオブジェクトを取得する方法をご紹介しました。

エクセルにリストアップした連絡先にメールを一気に送りたい場合や、連絡先によってメール本文を変えたい!といった場合に、エクセルVBAからOutlookのメールを操作することができれば、なかなか便利ですよね。

次回からは、エクセルVBAからMicrosoft Outlookでメールを作成して送信する方法をご紹介していきます。

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

連載目次:エクセルVBAでOutlookを操作してみよう!

エクセルVBAでOutlookのメール作成、送信やタスク登録などの操作をする方法をご紹介しています。メーラーとして便利なOutlookですが、VBAと組み合わせて更に便利に使ってしまいましょう。

  1. 【エクセルVBA】エクセルVBAでOutlookを操作しよう!参照設定とOutlookアプリケーションオブジェクトの取得

GASで作成したGoogleフォームを指定のフォルダに移動する方法

$
0
0
jump-on

photo credit: byronv2 must climb 05 via photopin (license)

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

GASでGoogleフォームを一発で作成するツールの作成する方法をお伝えしています。

前回の記事はコチラ。

GASでGoogleフォームを作成する最も簡単なスクリプト
イベントの申し込みフォームやアンケートを定期的に作成するのでれば、GASでGoogleフォームの作成ツールを作成しておくと便利です。今回は、Googleフォームを作成する最も簡単なスクリプトを紹介します。

Googleフォームを作成する最も簡単なスクリプトについて解説をしました。

本来なら、フォームの質問を追加する方法をお伝えしたいところですが、その前にやっておいたほうが良いことがあります。

ほら、作成したフォーム、いちいちマイドライブに保存されますでしょ。

マイドライブ散らかり放題になっちゃいます。

ということで、今回はGASで作成したGoogleフォームを指定のフォルダに移動する方法です。

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

前回のおさらい

前回紹介したスクリプトはコチラ。

function createEventForm(){
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
  var values = spreadsheet.getSheetByName('イベント概要').getDataRange().getValues();
  var formTitle = values[0][1]; //タイトル
  var formDescription = values[1][1]; //概要

  var form = FormApp.create(formTitle);
  form.setDescription(formDescription);
}

スプレッドシートの情報(タイトル、概要(=説明))をもとに、Googleフォームを作成するスクリプトです。

ただ、前置きでお伝えした通り、実行するたびにマイドライブに作成されちゃいます。

ちょっとやりづらいですよね。

今回は、作成したそばから別の指定のフォルダに移動する方法をお伝えしますね。

フォーム作成後に指定のフォルダにフォームを移動するスクリプト

では、早速ですがスクリプトを紹介しましょう。

前述のスクリプトの7行目と8行目の間に以下の4行を追加します。

var FOLDER_ID = PropertiesService.getScriptProperties().getProperty('FOLDER_ID');
var formFile = DriveApp.getFileById(form.getId());
DriveApp.getFolderById(FOLDER_ID).addFile(formFile);
DriveApp.getRootFolder().removeFile(formFile);

スクリプトプロパティからフォルダIDを取り出す

解説していきましょう。

まず、1行目はスクリプトプロパティから格納するフォルダのIDを取得して、変数FOLDER_IDに格納する部分ですね。

スクリプトプロパティには、事前に「FOLDER_ID」をキーに、格納先のフォルダIDを入力しておいてください。

スクリプトプロパティの入力と取得については以下の2つの記事を

【初心者向けGAS】プロパティストアの概要とスクリプトプロパティの編集方法
初心者向けGoogle Apps Script入門として名言Botの作り方をお伝えしています。今回は、コードに直書きしたくないデータを格納する機能プロパティストアについて、またスクリプトプロパティの入力の方法です。
【初心者向けGAS】スクリプトプロパティを操作してそのデータを取り出す方法
初心者向けのシリーズとしてGoogle Apps Scriptで名言Botの作り方を解説しております。今回は、GASでPropertiesサービスを使ってスクリプトプロパティからデータを取り出す方法です。

そして、その次の2行目で、作成したフォームをFileオブジェクトとして取得しています。

フォルダIDの取得方法とともに、以下の記事をご覧ください。

基本中の基本!GASでGoogleドライブのファイル・フォルダをIDで取得する
Google Apps ScriptでGoogleドライブ内のファイルを目的のフォルダに移動したいということはよくあります。今回はそのための準備としてフォルダやファイルをIDで操作する方法です。

フォームのIDを取得する

さて、そのフォームをFileオブジェクトとして取得する際に、getFileByIdメソッドの引数としてフォームIDが必要になります。

フォームIDを取得するには、FormオブジェクトのgetIdメソッドを使います。

Formオブジェクト.getId()

この辺の考え方は、スプレッドシートやドキュメントなど、他のファイルと同様ですね。

指定のフォルダにファイルを移動する

そして、その取得したFileオブジェクトをマイフォルダから指定のフォルダに移動しますが、その方法は以下の二段構えで実現します。

  1. 指定のフォルダにFileオブジェクトを追加する
  2. マイフォルダからFileオブジェクトを削除する

その部分が、前述のコードの4行目と5行目になります。

ここの流れは、以下の記事で紹介しているスプレッドシートの場合と全く同様ですので、参考にしてください。

Google Apps ScriptでGoogleドライブ内のファイルを追加・削除・移動をする方法
Google Apps ScriptでGoogleドライブの指定のフォルダにスプレッドシートファイルを追加・削除する方法です。追加と削除ができれば、移動もできます。またルートフォルダについても触れています。

まとめ

以上、GASで作成したGoogleフォームを指定のフォルダに移動する方法をお伝えしました。

フォームの作成ツールは定期的に使うものになると思いますから、面倒でも保存するフォルダについては対応していたほうが良いですよね。

動作確認もしやすいですしね。

まとめのスクリプトはコチラです。

function createEventForm(){
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
  var values = spreadsheet.getSheetByName('イベント概要').getDataRange().getValues();
  var formTitle = values[0][1]; //タイトル
  var formDescription = values[1][1]; //概要
  
  var form = FormApp.create(formTitle);
  
  var FOLDER_ID = PropertiesService.getScriptProperties().getProperty('FOLDER_ID');
  var formFile = DriveApp.getFileById(form.getId());
  DriveApp.getFolderById(FOLDER_ID).addFile(formFile);
  DriveApp.getRootFolder().removeFile(formFile);
  
  form.setDescription(formDescription);
}

次回は、いよいよフォームに質問を追加していきますね。

どうぞお楽しみに!

連載目次:GASでGoogleフォームを一発で作成するツールを作る

イベントの申し込みやアンケートにとっても便利なGoogleフォーム。スプレッドシートの入力内容をもとに、一発でフォームを作成するツールを作っていきます。
  1. GASでGoogleフォームを作成する最も簡単なスクリプト
  2. GASで作成したGoogleフォームを指定のフォルダに移動する方法

GASでPhantomJS Cloudを利用してWebページをスクレイピング

$
0
0

黒部ダムに虹が架かる
みなさん、こんにちは!うえはら(@tifoso_str)です。

JavaScriptで動作するWebページを色々な言語でスクレイピング】するシリーズの第四弾です。

前回はGASでJavaScriptで動作するWebページをスクレイピングするための準備として、PhantomJs Cloudを紹介しました。

GASでJavaScriptで動作するWebページをスクレイピングするPhantomJs Cloudとは
「JavaScriptで動作するWebページ(動的サイト)を色々な言語でスクレイピング」することをシリーズでお伝えしています。 今回はGoogle Apps Scriptでスクレイピングするために、PhantomJS Cloudのアカウント作成についてお伝えします。

Phantom Js Cloudはクラウドで動作するヘッドレスブラウザです。

簡単に言うと、スクレイピングしたいURLをわたすと、JavaScriptが実行された後のHTMLドキュメントを返してくれるサービスです。

無料プランでは、一日に500ページ程度まで利用できます。

GASでは、VBAのようにIEを操作できないので、IEの代わりとしてクラウドのサービスを利用します。

今回は実際に、GASでPhantomJs Cloudを利用して、Webページをスクレイピングしてみます。

PhantomJs CloudのAPIキーを取得する

PhantomJs Cloudへ移動して、右上の「ログイン」ボタンからログインします。

phantomJS_Login

下記のDashboardの画面に記載されている、ApiKeyを使用しますので、メモしておいてください。

phantomJS_ApiKey

GASでPhantomJs Cloudにアクセスする

それでは、下記ドキュメントに沿って、PhantomJs Cloudにアクセするスクリプトを説明していきます。

phantomJS_HTTPendpoint

PhantomJs CloudにアクセスするURL

PhantomJs CloudにアクセスするURLは下記のようになります。

http(s)://PhantomJsCloud.com/api/browser/v2/[YOUR-KEY]/?request=[REQUEST-JSON]

[YOUR-KEY]は先程確認したApiKeyを設定します。

[REQUEST-JSON]にはスクレイピングしたいWebページのURLやオプションを設定します。

この部分は次の項で説明します。

REQUEST-JSONの設定

JavaScript実行後のHTMLドキュメントをJSON形式で取得するには下記のようにします。

var payload = 
      {url:'URL',
       renderType:'HTML',
       outputAsJson:true};
  payload = JSON.stringify(payload);
  payload = encodeURIComponent(payload);

2行目でスクレイピングするURLを、3~4行目でHTMLドキュメントをJSON形式で取得するようにしています。

5行目は2~4行目のオブジェクトをJSON形式に変換するという意味です。

JSON.stringify(オブジェクト)

また、APIを確認すると「encodeURIComponent()」でエンコードするように書かれています。

  • The entirety of your [REQUEST-JSON] should be encoded via encodeURIComponent(), do not encode the parts individually.

URIエンコードとはURIの構成文字として制限されている文字を、ある規則に従って制限されていない文字列に変換する作業です。

GASではURIエンコードする関数もあるので、それを利用します。

encodeURIComponent(文字列)

これで、PhantomJs Cloudへ送信するURLが準備できました。

あとは、UrlFetchサービスのfetchメソッドでPhantomJs Cloudへアクセスするだけです。

PhantomJs Cloudにアクセスするスクリプト

今までの部分を合わせると下記のようなスクリプトとなります。

function scraping() {
  const URL = 'https://www.eb.pref.okinawa.jp/kassui/';//沖縄県企業局のダム貯水率 
  var key = '**-#####-*****-#####-*****-#####';
  
  var payload = 
      {url:URL,
       renderType:'HTML',
       outputAsJson:true};
  payload = JSON.stringify(payload);
  payload = encodeURIComponent(payload);

  var url = 'https://phantomjscloud.com/api/browser/v2/'+ key +'/?request=' + payload;                

  var response = UrlFetchApp.fetch(url);
}

PhantomJs Cloudから帰ってくるデータの確認

変数responseにPhantomJs Cloudからのデータが格納されているので、文字列として取り出します。

HTTPResponseオブジェクト.getContentText()

また、先程、JSON形式で取得するようにしているので、JSON形式の文字列を解析します。

JSON.parse(文字列)

getContentTextメソッドとJSON.parseメソッドはセットで使うことが多いので、一緒に覚えておきましょう。

それでは、下記を追加して実行してログ確認してみます。

var json = JSON.parse(response.getContentText());
  Logger.log(json);

phantomJS_JSONログ確認

データは取得できているようですが、目的のHTMLドキュメントが何処にあるかわからないですね。

ログでは全て表示できないので、ドキュメントに書き出して見ると、必要な箇所は下記のようになっています。

phantomJS_jsonのHTMLドキュメント確認

構造を確認すると「content」の「data」にあることがわかりましたので、スクリプトを変更して再度確認します。

var json = JSON.parse(response.getContentText()); 
  var source = json["content"]["data"];
  Logger.log(source);

phantomJS_HTMLログ確認

はい、無事に取得できました。

まとめ

今までのスクリプトをまとめると下記のようになります。

function scraping() {
 
  const URL = 'https://www.eb.pref.okinawa.jp/kassui/';//沖縄県企業局のダム貯水率 
  var key = '**-#####-*****-#####-*****-#####';
  
  var option = 
      {url:URL,
       renderType:"HTML",
       outputAsJson:true};
  var payload = JSON.stringify(option);
  payload = encodeURIComponent(payload);
  var url = "https://phantomjscloud.com/api/browser/v2/"+ key +"/?request=" + payload;                
  var response = UrlFetchApp.fetch(url);
 
  var json = JSON.parse(response.getContentText()); 
  var source = json["content"]["data"];
  }

今回は、GASでPhantomJs Cloudを利用して、Webページをスクレイピングしてみました。

エンコードしたり、JSON形式に変換したり、最初は難しいですね。

今回でHTMLドキュメントを取得できたので、あとは、matchメソッドと正規表現を使って目的の値を取得するだけです。

次回は、HTMLドキュメントの中からmatchメソッドと正規表現を使って目的の値を取得します。

お楽しみに!

連載目次:JavaScriptで動作するWebページを色々な言語でスクレイピング

Webスクレイピングしていて、値が取得できないということはありませんか?

そんな時は、Webサイトの表示にJavaScriptを利用しているからです。

本連載では、色々な言語でその対応をご紹介します!

  1. GASやVBAでスクレイピングができない理由として考えるべきJavaScriptのこと
  2. VBAでIEを操作してJavaScriptで動作するWebページをスクレイピング
  3. GASでJavaScriptで動作するWebページをスクレイピングするPhantomJsとは
  4. GASでPhantomJSを利用してWebページをスクレイピング
  5. HTMLドキュメントの中からmatchメソッドと正規表現を使って目的の値を取得

GASでGoogleフォームに記述式の質問を追加する方法

$
0
0
pen

photo credit: -svetlanaya- Macro Mondays – Fingertip(s) via photopin (license)

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

GASでGoogleフォームを作成する方法についてお伝えしています。

前回の記事はコチラ。

GASで作成したGoogleフォームを指定のフォルダに移動する方法
GASでGoogleフォームを一発で作成するツールの作成する方法をお伝えしています。今回は、GASで作成したGoogleフォームを指定のフォルダに移動する方法、スクリプトストアやDriveサービスを使います。

作成したフォームを指定のフォルダに保存する方法をお伝えしました。

今回は、いよいよ質問の追加をしていきます。まずは、簡単なところからテキスト、つまり記述式の質問からです。

では、GASでGoogleフォームに記述式の質問を追加する方法です。

行ってみましょう!

前回のおさらい

前回までで作成したスクリプトはコチラです。

function createEventForm(){
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
  var values = spreadsheet.getSheetByName('イベント概要').getDataRange().getValues();
  var formTitle = values[0][1]; //タイトル
  var formDescription = values[1][1]; //概要
  
  var form = FormApp.create(formTitle);
  
  var FOLDER_ID = PropertiesService.getScriptProperties().getProperty('FOLDER_ID');
  var formFile = DriveApp.getFileById(form.getId());
  DriveApp.getFolderById(FOLDER_ID).addFile(formFile);
  DriveApp.getRootFolder().removeFile(formFile);
  
  form.setDescription(formDescription);
}

実行すると、スプレッドシートの情報をもとに作成したフォームが、スクリプトプロパティのFOLDER_IDにIDを指定したフォルダに作成されます。

ただ、このフォーム。

タイトルと概要だけで、質問が何も追加されていません。

今回はまず、テキスト形式、つまり記述式の質問として「氏名」と「会社名」を追加していきます。

フォームに記述式の質問を追加する

フォームに記述式の質問を追加するには、FormオブジェクトにaddTextItemメソッドを使います。

書式はコチラです。

Formオブジェクト.addTextItem()

addTextItemメソッドの戻り値は、TextItemオブジェクトという記述式の質問を表すオブジェクトになります。

ただ、これだけでは空っぽのテキスト入力欄が追加されるだけです。

setTitleメソッドで質問のタイトルを設定する

ですから、質問のタイトルはそれとは別に設定してあげる必要があります。

そのために、addTextItemメソッドの戻り値である、TextItemオブジェクトに対してsetTitleメソッドを使ってあげます。

TextItemオブジェクト.setItem(質問のタイトル)

setRequiredメソッドで質問の回答を必須にする

「氏名」といった項目は、フォームの入力項目としては「必須」ですよね。

Googleフォームでは入力必須の設定をすることができます。

つまり、必須に設定した質問に回答をしないと「送信」ができないように設定できるのです。

GASでも、質問が必須かどうかを設定することができます。

記述式の質問について必須にするかどうかは、TextItemオブジェクトに対してsetRequiredメソッドを使います。

TextItemオブジェクト.setRequired(必須かどうか)

必須かどうかは真偽値つまりtrueかfalseで設定をします。

記述式の質問を含むフォームを生成するスクリプト

では、前述のスクリプトに記述式の「氏名」と「会社名」を質問として追加したスクリプトを紹介します。

function createEventForm(){
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
  var values = spreadsheet.getSheetByName('イベント概要').getDataRange().getValues();
  var formTitle = values[0][1]; //タイトル
  var formDescription = values[1][1]; //概要
  
  var form = FormApp.create(formTitle);
  
  var FOLDER_ID = PropertiesService.getScriptProperties().getProperty('FOLDER_ID');
  var formFile = DriveApp.getFileById(form.getId());
  DriveApp.getFolderById(FOLDER_ID).addFile(formFile);
  DriveApp.getRootFolder().removeFile(formFile);
  
  form.setDescription(formDescription);
  form.addTextItem().setTitle('氏名').setRequired(true);
  form.addTextItem().setTitle('会社名');      
}

15,16行目が新たに追加した行になりますね。

実行をすると、以下のようなフォームを作成することができます。

記述式の質問を追加したフォームを作成した

「氏名」にはアスタリスクマークがついていて必須であることはわかりますね。

まとめ

以上、GASで記述式の質問を追加したGoogleフォームの作り方についてお伝えしました。

記述式つまりテキスト形式の質問の作り方は、他の質問であったとしても一緒なので、必要に応じて使ってくださいね。

さて、次回はメールアドレスの入力欄を作っていきます。

どうぞお楽しみに!

連載目次:GASでGoogleフォームを一発で作成するツールを作る

イベントの申し込みやアンケートにとっても便利なGoogleフォーム。スプレッドシートの入力内容をもとに、一発でフォームを作成するツールを作っていきます。
  1. GASでGoogleフォームを作成する最も簡単なスクリプト
  2. GASで作成したGoogleフォームを指定のフォルダに移動する方法
  3. GASでGoogleフォームに記述式の質問を追加する方法

【エクセルVBA】Outlookでメールを作成・送信する方法

$
0
0

vba,メール送信,send,eyecatch

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

前回記事では、エクセルVBAでOutlookを操作するための準備として、Microsoft Outlook XX.X Object Libraryの参照設定の方法と、Outlookアプリケーションオブジェクトの取得方法をご紹介しました。

【エクセルVBA】エクセルVBAでOutlookを操作しよう!参照設定とOutlookアプリケーションオブジェクトの取得
エクセルVBAでOutlookのメール送信やタスク作成操作をする前準備として、VBEの参照設定や、Outlookアプリケーションオブジェクトの取得方法をご紹介しています。 VBAとOutlookを組み合わせて使うことで、既に便利に使えているメーラーを更に便利にできるかもしれませんよ。

今回は、前回取得したOUtlookアプリケーションオブジェクトで、エクセルVBAからOutlookにメールを送信させる方法をご紹介します!

MailItemオブジェクトで新しいメールを操作する

さて、前回記事でOutlookアプリケーションオブジェクトは取得できているので、お次はMailItemオブジェクトを作成しましょう。

MailItemオブジェクトとは?

MailItemオブジェクトは、Outlookの新しいメールを操作するためのオブジェクトです。

Outlookは、メールのほかに予定やタスク、連絡先といったアイテムを登録することができますよね。

VBAでは、そういったアイテムを、下記のオブジェクトによって作成・操作することができます。

Outlookのアイテム オブジェクト名
メール MailItem
予定 AppointmentItem
タスク TaskItem
連絡先 ContactItem

CreateItemメソッドでMailItemオブジェクトを作成する

では、MailItemオブジェクトを作成しましょう。

まずは、MailItemオブジェクト型変数の宣言をします。

Dim オブジェクト名 As Outlook.MailItem

そして、CreateItemメソッドで、MailItemオブジェクトを作成します。

CreateItemメソッドは、先に上げたようなOutlookアイテムのオブジェクトを作成するメソッドで、下記のように記述します。

Outlookアプリケーションオブジェクト.CreateItem(作成するオブジェクトの種類)

CreateItemメソッドのパラメータ

CreateItemメソッドのパラメータには、Outlookで作成する各アイテムタイプの種類名か、値を指定します。

作成するオブジェクト 指定するアイテムの種類名 オブジェクトの役割
MailItem olMailItem 0 新しいメールを表すオブジェクト
AppointmentItem olAppointmentItem 1 新しい予定を表すオブジェクト
ContactItem olContactItem 2 新しい連絡先を表すオブジェクト
TaskItem olTaskItem 3 新しいタスクを表すオブジェクト

MailItemオブジェクトを作成する

今回は新しいメールを表すMailItemオブジェクトを作成したいので、CreateItemメソッドのパラメータにはこのようにolMailItemか、を指定すればOKです。

Outlookアプリケーションオブジェクト.CreateItem(olMailItem)
コードにしてみると、こんな感じになります。
Dim objOutlook As Outlook.Application
Dim objMail As Outlook.MailItem

Set objOutlook = New Outlook.Application
Set objMail = objOutlook.CreateItem(olMailItem)

これで、MailItemオブジェクトが作成できました!

お次はMailItemオブジェクトのプロパティで、メールの中身をセットしていきましょう。

MailItemオブジェクトのプロパティ

MailItemオブジェクトには、例えばこちらのようなプロパティがあります。

プロパティ 内容
To メールの宛先。
CC メールのCC。
BCC メールのBCC。
Body メール本文。
BodyFormat メールのテキスト形式。プレーンテキスト(olFormatPlain)、HTML(olFormatHTML)、リッチテキスト(olFormatRichText)のいずれかを指定する。

これらのプロパティに、こんな感じで値をセットしていきます。

With objMail
    .To = "MailAddress@xx.xx"       'メール宛先
    .Subject = "メールの件名"    'メール件名
    .Body = "メール本文"                'メール本文
    .BodyFormat = olFormatPlain    'メールの形式
End With

MailItem.Sendメソッドでメールを送信する

さて、MailItemオブジェクトのプロパティに値を指定すれば、メールの作成は完了です。

後はこのメールを送信すればOK。

Outlookのメールを送信するには、MailItemオブジェクトのSendメソッドを使います。

記述方法はコチラ。

MailItemオブジェクト.Send

エクセルVBAでOutlookにメールを送信させるコード

では、MailItemオブジェクトとプロパティ、Sendメソッドを使ってメールを送信してみましょう。

こちらのエクセルシートに記入された文章を、メールのタイトルと本文にセットして送信してみます。

vba,send,メール.送信メール
コードがこちら。
Sub SendEmail()

Dim objOutlook As Outlook.Application
Dim objMail As Outlook.MailItem
Dim wsMail As Worksheet

Set objOutlook = New Outlook.Application
Set wsMail = ThisWorkbook.Sheets("メール内容")

Set objMail = objOutlook.CreateItem(olMailItem)

With wsMail

    objMail.To = "MailAddress@xx.xx"       'メール宛先
    objMail.Subject = .Range("B1").Value   'メール件名
    objMail.BodyFormat = olFormatPlain     'メールの形式
    objMail.Body = .Range("B2").Value      'メール本文

    objMail.Send
End With

Set objOutlook = Nothing
MsgBox "送信完了"

End Sub

エクセルシートのB1セルに記入された内容を、Subjectプロパティに、B2セルに入力された内容をそれぞれセットしてメールを送信するコードです。

そしてこちらのコードを実行して送信されたメールを受信したものがこちらです。

vba,send,メール,送信結果

当たり前ですが、手動で送ったメールと変わりありませんね。

ちゃんとメールの送信ができています!

最後に

今回は、エクセルVBAからOutlookにメールを送信させる方法をご紹介しました。

メール1件2件程度なら手でのメール送信で良いかもしれませんが、10件20件を手動で送信となると辛いものがありますよね。

エクセルVBAからOutlookにメールを送信させられれば、これまで手間だったメール送信作業を、一気に簡略化できるかもしれませんよ。

次回は、エクセルシートにリストアップされた複数のメールアドレスに、メール本文の内容を変えつつ送信する方法をご紹介します。

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

連載目次:エクセルVBAでOutlookを操作してみよう!

エクセルVBAでOutlookのメール作成、送信やタスク登録などの操作をする方法をご紹介しています。メーラーとして便利なOutlookですが、VBAと組み合わせて更に便利に使ってしまいましょう。

  1. 【エクセルVBA】エクセルVBAでOutlookを操作しよう!参照設定とOutlookアプリケーションオブジェクトの取得

GASでGoogleフォームにメールアドレスの入力欄とバリデーションを追加する方法

$
0
0
at-sign

photo credit: baldiri arroba via photopin (license)

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

GASでGoogleフォームを作成するツールの作り方について解説をしています。

前回の記事はコチラ。

GASでGoogleフォームに記述式の質問を追加する方法
GASでGoogleフォームを作成する方法についてお伝えしています。今回は、GASで作成するフォームに、addTextItemメソッドを使って氏名や会社名などの記述式の質問を追加していきます。

フォームにテキスト形式、つまり記述式の質問を追加する方法をお伝えしました。

氏名、会社名の入力欄を作ることができましたので、今回はメールアドレスの入力欄を作っていきたいと思います。

ということで、GASでGoogleフォームにメールアドレスの入力欄を追加する方法です。

また、メールアドレスではないときに入力を制限してくれる「回答の検証」の設定もしていきますよ。

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

前回のおさらい

前回までに作成したコードはコチラです。

function createEventForm(){
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
  var values = spreadsheet.getSheetByName('イベント概要').getDataRange().getValues();
  var formTitle = values[0][1]; //タイトル
  var formDescription = values[1][1]; //概要
  
  var form = FormApp.create(formTitle);
  
  var FOLDER_ID = PropertiesService.getScriptProperties().getProperty('FOLDER_ID');
  var formFile = DriveApp.getFileById(form.getId());
  DriveApp.getFolderById(FOLDER_ID).addFile(formFile);
  DriveApp.getRootFolder().removeFile(formFile);
  
  form.setDescription(formDescription);
  form.addTextItem().setTitle('氏名').setRequired(true);
  form.addTextItem().setTitle('会社名');      
}

スプレッドシートの情報をもとに、スクリプトプロパティのFOLDER_IDに指定したフォルダに新規のフォームを作成します。

フォームの質問は「氏名」と「会社名」という記述式の入力欄が2つです。

イベントの申し込みであれば、さらに必要な入力項目ありますよね。

例えば、メールアドレス。連絡手段ほしいっすもんね。

フォームにメールアドレスの入力欄を追加する

メールアドレスとはいえ、「氏名」や「会社名」と同様、記述式を使います。

つまり、以下のステートメントを追加してあげればOKです。

form.addTextItem().setTitle('メールアドレス').setRequired(true);

はい終わり~!

…だと、記事として薄すぎるので、もうちょっとGASの便利なところを紹介していきましょう。

メールアドレスかどうか回答を検証する

記述式なので、文字列であれば、なんでも入力できてしまいます。

間違えて住所を入れてしまうかも知れませんし、「@」を忘れてしまうかも知れません。

それを避けるために、Googleフォームには入力された回答がメールアドレスかどうかを判定する「回答の検証」という機能があります。

そして、それはGASからも設定することができるのです。

TextItemオブジェクトの回答の検証を設定する

では、「回答の検証」の設定の仕方を説明していきましょう。

TextItemオブジェクトに「回答の検証」を設定するためには、setValidationメソッドを使います。

書式はコチラです。

TextItemオブジェクト.setValidation(バリデーション)

引数の「バリデーション」には、テキスト用の回答の検証を表すTextValidationオブジェクトを指定します。(Validationとは「検証」という意味ですね。)

例えば、TextValidationオブジェクトがvalidationEmailという変数にセットされているとしたら、前述のメールアドレスの質問追加のステートメントを以下のようにしてあげればOKです。

form.addTextItem().setTitle('メールアドレス').setRequired(true).setValidation(validationEmail);

テキスト用の回答の検証をビルドする

それで、そのTextValidationオブジェクトを用意する必要がありますよね。

いくつか手順がありまして、流れとしては以下のような流れになります。

  1. TextValidationBuilderオブジェクトを生成する
  2. 生成したTextValidationBuilderオブジェクトに追加したい検証をセットする
  3. TextValidationBuilderオブジェクトからTextValidationオブジェクトをビルドする

なんじゃこれ、ややこしいな…と思われるかも知れませんね。

大丈夫。解説していきます。

なお、TextValidationBuilderオブジェクトとは、テキスト用バリデーションをビルドするためのオブジェクトです。

このオブジェクトにあれこれ検証として追加したい項目をセットしていって、最終的に「ビルド」をすることで、TextValidationオブジェクトが完成します。

TextValidationBuilderオブジェクトを生成する

まず、TextValidationBuilderオブジェクトを生成します。

これにはFormAppオブジェクトのcreateTextValidationメソッドを使います。

こちらです。

FormAppオブジェクト.createTextValidation()

戻り値はTextValidationBuilderオブジェクトです。

TextValidationBuilderオブジェクトに検証「メールアドレス」を追加する

生成されたTextValidationBuilderオブジェクトにメールアドレスかどうかの検証を追加します。

そのための、requireTextIsEmailメソッドが用意されています。

TextValidationBuilderオブジェクト.requireTextIsEmail()

TextValidationオブジェクトをビルドする

検証の設定はこれでOKですので、ビルドをしてTextValidationオブジェクトにします。

TextValidationBuilderオブジェクトにbuildメソッドを使います。

TextValidationBuilderオブジェクト.build()

こうしてできたTextValidationオブジェクトを、TextItemオブジェクトにsetValidationしてあげればOKです。

メールアドレスの入力欄を追加したフォームを作るスクリプト

以上を踏まえて、メールアドレスの入力欄も追加するようにしたスクリプトはこのようになります。

function createEventForm(){
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
  var values = spreadsheet.getSheetByName('イベント概要').getDataRange().getValues();
  var formTitle = values[0][1]; //タイトル
  var formDescription = values[1][1]; //概要
  
  var form = FormApp.create(formTitle);
  
  var FOLDER_ID = PropertiesService.getScriptProperties().getProperty('FOLDER_ID');
  var formFile = DriveApp.getFileById(form.getId());
  DriveApp.getFolderById(FOLDER_ID).addFile(formFile);
  DriveApp.getRootFolder().removeFile(formFile);
  
  form.setDescription(formDescription);
  form.addTextItem().setTitle('氏名').setRequired(true);
  form.addTextItem().setTitle('会社名');
  
  var validationEmail = FormApp.createTextValidation().requireTextIsEmail().build();
  form.addTextItem().setTitle('メールアドレス').setRequired(true).setValidation(validationEmail);
}

新たに追加したのは、18,19行目ですね。

実行すると、以下のように「回答の検証」として、テキストのメールアドレスが設定されていることが確認できます。

Googleフォームでメールアドレスのバリデーションを設定した

また、実際の回答フォームで適当に入力すると以下のように「有効なメールアドレスを入力してください」というメッセージが出ますね。親切です。

Googleフォームのメールアドレスのバリデーションの動作

まとめ

以上、GASでGoogleフォームにメールアドレスの入力欄を追加する方法についてお伝えしました。

メールアドレスの「回答の検証」ビルダーとかいろいろと遠回りな感じがしますが、使いこなせると便利です。

GASでは今回紹介した「回答の検証」以外にも「ビルダー」を使って、オブジェクトを構築するようなケースがありますので、ビルダーの取り扱いについても慣れておくとよいでしょう。

次回は、選択式の質問について追加をしていきたいと思います。

どうぞお楽しみに!

連載目次:GASでGoogleフォームを一発で作成するツールを作る

イベントの申し込みやアンケートにとっても便利なGoogleフォーム。スプレッドシートの入力内容をもとに、一発でフォームを作成するツールを作っていきます。
  1. GASでGoogleフォームを作成する最も簡単なスクリプト
  2. GASで作成したGoogleフォームを指定のフォルダに移動する方法
  3. GASでGoogleフォームに記述式の質問を追加する方法
  4. GASでGoogleフォームにメールアドレスの入力欄とバリデーションを追加する方法

GASでGoogleフォームにラジオボタンの質問を追加する方法

$
0
0
radio-button

photo credit: Michel Curi 1959 6-Tube Pushbutton AM Radio via photopin (license)

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

GASでGoogleフォームによるイベント申し込みフォームを作成する方法についてお伝えしています。

前回の記事はコチラ。

GASでGoogleフォームにメールアドレスの入力欄とバリデーションを追加する方法
GASでGoogleフォームを作成するツールの作り方について解説をしています。今回は、GASでGoogleフォームにメールアドレスの入力欄を追加する方法です。回答の検証つまり、バリデーションも追加しますよ。

フォームにメールアドレスの入力欄を追加する方法をお伝えしました。

さて、もっと色々な質問をしたいですよね。

たとえば、ラジオボタンとか…!

ということで、今回はGASでGoogleフォームにラジオボタンの質問を追加する方法です。

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

前回までのおさらい

前回までに作成したスクリプトはコチラです。

function createEventForm(){
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
  var values = spreadsheet.getSheetByName('イベント概要').getDataRange().getValues();
  var formTitle = values[0][1]; //タイトル
  var formDescription = values[1][1]; //概要
  
  var form = FormApp.create(formTitle);
  
  var FOLDER_ID = PropertiesService.getScriptProperties().getProperty('FOLDER_ID');
  var formFile = DriveApp.getFileById(form.getId());
  DriveApp.getFolderById(FOLDER_ID).addFile(formFile);
  DriveApp.getRootFolder().removeFile(formFile);
  
  form.setDescription(formDescription);
  form.addTextItem().setTitle('氏名').setRequired(true);
  form.addTextItem().setTitle('会社名');
  
  var validationEmail = FormApp.createTextValidation().requireTextIsEmail().build();
  form.addTextItem().setTitle('メールアドレス').setRequired(true).setValidation(validationEmail);
}

スプレッドシートのデータを元に、イベント申し込み用のフォームを作成するスクリプトです。

質問は今のところ

  • 氏名
  • 会社名
  • メールアドレス

…これだけですので、もうちょっと増やしたいですね。

今回は、ラジオボタン形式の「お持ちのPCのOSは?」という質問を追加していきたいと思います。

フォームにラジオボタンの質問を追加する

フォームにラジオボタンを追加するには、FormオブジェクトにaddMultipleChoiceItemメソッドを使います。

Formオブジェクト.addMultipleChoiceItem()

これでOK。

ただ、これだけでは質問のタイトルも、選択項目もないスカスカのラジオボタンになってしまいますので、それらを設定する必要があります。

ラジオボタンの質問のタイトルを設定する

addMultipleChoiceItemメソッドの戻り値は、MultipleChoiceItemオブジェクトというオブジェクトになります。

そのオブジェクトに対して、色々なメソッドを実行することで、質問の詳細を設定していくことができます。

まず、質問のタイトルを設定するには、setTitleメソッドを使います。

MultipleChoiceItemオブジェクト.setTitle(質問のタイトル)

これは、記述式の質問を追加する場合と同じノリですね。

ラジオボタンの選択項目を設定する

ラジオボタンの場合は、選択項目も設定してあげる必要がありますね。

その場合は、MultipleChoiceItemオブジェクトに対して、setChoiceValuesメソッドを使います。

MultipleChoiceItemオブジェクト.setChoiceValues(選択肢の配列)

選択肢を、文字列の配列で指定することで、ラジオボタンの選択項目をまとめて設定することができます。

ラジオボタンの質問を追加するスクリプト

以上を踏まえまして、フォームにラジオボタンで「お持ちのPCのOSは?」という質問を追加するようにスクリプトを修正しました。

こちらです。

function createEventForm(){
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
  var values = spreadsheet.getSheetByName('イベント概要').getDataRange().getValues();
  var formTitle = values[0][1]; //タイトル
  var formDescription = values[1][1]; //概要
  
  var form = FormApp.create(formTitle);
  
  var FOLDER_ID = PropertiesService.getScriptProperties().getProperty('FOLDER_ID');
  var formFile = DriveApp.getFileById(form.getId());
  DriveApp.getFolderById(FOLDER_ID).addFile(formFile);
  DriveApp.getRootFolder().removeFile(formFile);
  
  form.setDescription(formDescription);
  form.addTextItem().setTitle('氏名').setRequired(true);
  form.addTextItem().setTitle('会社名');
  
  var validationEmail = FormApp.createTextValidation().requireTextIsEmail().build();
  form.addTextItem().setTitle('メールアドレス').setRequired(true).setValidation(validationEmail);
  
  form.addMultipleChoiceItem()
    .setTitle('お持ちのPCのOSは?')
    .setChoiceValues(['Windows', 'Mac']);
}

選択肢は、WindowsとMacの二択です。

これを実行すると、以下のようなラジオボタン形式の質問を追加することができます。

GASでGoogleフォームでラジオボタン形式の質問を追加

まとめ

以上、GASでGoogleフォームにラジオボタン形式の質問を追加する方法についてお伝えしました。

ちょっとオブジェクト名が「MultipleChoiceItem」などと難しい感じがしますが、オブジェクト名が長いだけで、なんてことはありません。

さて、次回はこれに似た質問となりますが、チェックボックスを追加する方法です。

どうぞお楽しみに!

連載目次:GASでGoogleフォームを一発で作成するツールを作る

イベントの申し込みやアンケートにとっても便利なGoogleフォーム。スプレッドシートの入力内容をもとに、一発でフォームを作成するツールを作っていきます。
  1. GASでGoogleフォームを作成する最も簡単なスクリプト
  2. GASで作成したGoogleフォームを指定のフォルダに移動する方法
  3. GASでGoogleフォームに記述式の質問を追加する方法
  4. GASでGoogleフォームにメールアドレスの入力欄とバリデーションを追加する方法
  5. GASでGoogleフォームにラジオボタンの質問を追加する方法

GASでスクレイピングしたデータからmatchメソッドと正規表現を使って目的の値を取得

$
0
0

黒部ダム放水

みなさん、こんにちは!うえはら(@tifoso_str)です。

JavaScriptで動作するWebページを色々な言語でスクレイピング】するシリーズの第五弾です。

前回はGASでPhantomJSを利用してWebページをスクレイピングしました。

GASでPhantomJS Cloudを利用してWebページをスクレイピング
「JavaScriptで動作するWebページ(動的サイト)を色々な言語でスクレイピング」することをシリーズでお伝えしています。 今回はGoogle Apps ScriptとPhantomJS Cloudでスクレイピングします!

HTMLドキュメントを取得するところまでできたので、今回はHTMLドキュメントの中からmatchメソッドと正規表現を使って目的の値を取得してみます。

前回までのおさらい

GASでJavaScriptで動作するWebページをスクレイピングするにはPhantomJS Cloudを利用する必要があります。

Phantom Js Cloudはクラウドで動作するヘッドレスブラウザで、簡単に言うと、スクレイピングしたいURLをわたすと、JavaScriptが実行された後のHTMLドキュメントを返してくれるサービスです。

GASでPhantomJSを利用してWebページをスクレイピングするスクリプトは下記のようになります。

function scraping() {
 
  const URL = 'https://www.eb.pref.okinawa.jp/kassui/';//沖縄県企業局のダム貯水率 
  var key = '**-#####-*****-#####-*****-#####';
  
  var option = 
      {url:URL,
       renderType:"HTML",
       outputAsJson:true};
  var payload = JSON.stringify(option);
  payload = encodeURIComponent(payload);
  var url = "https://phantomjscloud.com/api/browser/v2/"+ key +"/?request=" + payload;                
  var response = UrlFetchApp.fetch(url);
 
  var json = JSON.parse(response.getContentText()); 
  var source = json["content"]["data"];
  Logger.log(source);
  }

ログを確認すると、下記のようになります。

phantomJS_HTMLログ確認

matchメソッドと正規表現を利用して目的の値を取得する

上記でHTMLドキュメントを、取得できることを確認しました。

あとは、matchメソッド正規表現をうまく使えば目的の値を取得できます。

matchメソッドについて

特定の文字列を検索するときにはmatchメソッドを使用します。

文字列.match(検索条件)

検索条件に一致した場合、抽出された文字列は配列に格納されます。

もし、一致する文字列がない場合の戻り値はnullとなりますので、場合によってはエラー処理が必要になります。

また、検索条件に正規表現を用いることで、色々な文字列を柔軟に検索することが出来ます。

正規表現について

正規表現には、正規表現リテラルで表記する方法とRegExpオブジェクトを使う方法があります。

今回は、よく使われる正規表現リテラルを使用します。

正規表現リテラルは、スラッシュ/)で囲んで表記します。

正規表現のメタ文字と用法は多数ありますので、スクレイピングするときによく使うものを紹介します。

スクレイピングするときには、特定のタグに囲まれた文字列をよく検索します。

例えばタイトルは下記のようになっています。

<title>ダム貯水率 | 安全・安心な水を届ける沖縄県企業局</title>

<title>と</title>で囲まれている部分を取得できればいいわけで、その場合、下記のように表記します。

var myRegexp = /<title>([\s\S]*?)<\/title>/;

それぞれのメタ文字の意味は下記の通りです。

文字 機能
() グループ
[] 角括弧内のいずれかの1文字
\s 空白文字
\S 空白以外の文字
* 直前の文字が0文字以上
? 直前の文字が0文字または1文字以上

ここで、「?」は単独では上の意味ですが、他のメタ文字の直後に指定した場合、最短の文字列とマッチするように制限します。

今回のメタ文字は、空白文字と空白以外の文字列が0文字以上繰り返される最短の文字列と一致する、という意味になります。

あとは、matchメソッドを合わせて、下記のようなスクリプトで、タイトル部分を取得できます。

var myRegexp = /<title>([\s\S]*?)<\/title>/;
  var title = source.match(myRegexp);

最短の文字列とマッチするように制限する理由

ここで、なぜ「?」をつけて最短の文字列とマッチするように制限しているか疑問があると思います。

上の例のタイトルは、HTMLドキュメントの中に一つしかないので無くても問題ないのですが、貯水率を取得する部分を見るとその理由がわかります。

貯水率の部分のHTMLドキュメントは下記のようになっています。

(関係ない行は省略しています。)

<table summary="ダム貯水率状況" width="100%">
    <tbody>
        <tr>...</tr>
        <tr>...</tr>
        <tr>...</tr>
        <tr>
            <th class="caution_bg_03">本日の貯水率(%)</th>
            <td align="right" id="ritsu_today1">84.2</td>
            <td align="right" id="ritsu_today2">89.4</td>
            <td align="right" id="ritsu_today3">98.7</td>
            <td align="right" id="ritsu_today4">84.6</td>
        </tr>
        <tr>
            <th class="caution_bg_03">平年値(%)(※1)</th>
            <td align="right" id="ave1">81.7</td>
            <td align="right" id="ave2">86.8</td>
            <td align="right" id="ave3">90.0</td>
            <td align="right" id="ave4">82.2</td>
        </tr>
        <tr>...</tr>
    </tbody>
</table>

本日の貯水率を取得する場合、「id=”ritsu_today4″>」と「</td>」で囲まれた部分を検索するようにします。

はじめの「id=”ritsu_today4″>」は一つですが、後ろの「</td>」は複数あります。

「?」を付けないと、空白文字と空白以外の文字列が0文字以上繰り返される最長の文字列と一致する条件となるので、一番最後の「</td>」まで抽出されてしまいます。

これでは都合がよくないですよね。

このような理由から、目的の部分を効率よく抽出するために「?」をつけて、最短の文字列とマッチするように制限しています。

GASとPhantomJs CloudでJavaScriptで動作するページから目的の値を取得するスクリプト

今までのスクリプトをまとめると下記のようになります。

function scraping() {
 
  const URL = 'https://www.eb.pref.okinawa.jp/kassui/';//沖縄県企業局のダム貯水率 
  var key = '**-#####-*****-#####-*****-#####';
  
  var option = 
      {url:URL,
       renderType:"HTML",
       outputAsJson:true};
  var payload = JSON.stringify(option);
  payload = encodeURIComponent(payload);
  var url = "https://phantomjscloud.com/api/browser/v2/"+ key +"/?request=" + payload;                
  var response = UrlFetchApp.fetch(url);
 
  var json = JSON.parse(response.getContentText()); 
  var source = json["content"]["data"];
  
  var myRegexp = /<title>([\s\S]*?)<\/title>/;
  var title = source.match(myRegexp);
  Logger.log(title[1]);
  
  var myRegexp = /<span id=\"chosui_hiduke\">([\s\S]*?)<\/span>/;
  var day = source.match(myRegexp);
  Logger.log(day[1]);
  
  var myRegexp = /id=\"ritsu_today4\">([\s\S]*?)<\/td>/;
  var waterRate = source.match(myRegexp);
  Logger.log(waterRate[1]);

}

前々回で、検索にマッチした結果の中身の部分が配列の2番目に入ることがわかったので、各ログ出力の部分で利用しています。

phantomJS_最終ログ確認

はい、ちゃんと値を取得できました!

まとめ

今回は、HTMLドキュメントの中からmatchメソッドと正規表現を使って目的の値を取得してみました。

正規表現は難しいと思いますので、少しずつ覚えていくといいと思います。

PhantomJs Cloud使って、正規表現使いこなせれば、スクレイピングは怖いものなしですかね?

次回は、GASに変わってpythonとPhantomJs Cloudを利用してJavaScriptで動作するWebページをスクレイピングしてみます。

お楽しみに!

連載目次:JavaScriptで動作するWebページを色々な言語でスクレイピング

Webスクレイピングしていて、値が取得できないということはありませんか?

そんな時は、Webサイトの表示にJavaScriptを利用しているからです。

本連載では、色々な言語でその対応をご紹介します!

  1. GASやVBAでスクレイピングができない理由として考えるべきJavaScriptのこと
  2. VBAでIEを操作してJavaScriptで動作するWebページをスクレイピング
  3. GASでJavaScriptで動作するWebページをスクレイピングするPhantomJsとは
  4. GASでPhantomJSを利用してWebページをスクレイピング
  5. GASでスクレイピングしたデータからmatchメソッドと正規表現を使って目的の値を取得

GASでGoogleフォームにチェックボックス形式の質問を追加する方法

$
0
0

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

GASでGoogleフォームを作成するツールを作成しています。

前回の記事はコチラ。

GASでGoogleフォームにラジオボタンの質問を追加する方法
GASでGoogleフォームによるイベント申し込みフォームを作成する方法についてお伝えしています。今回は、フォームにMultipleChoiceItemオブジェクト…つまり。ラジオボタンの質問を追加する方法です。

フォームにラジオボタンを追加する方法をお伝えしました。

テキスト、ラジオボタン…ときましたので、今回はチェックボックスにしましょう。

ということで、GASでGoogleフォームにチェックボックス形式の質問を追加する方法です。

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

前回のおさらい

前回作成したスクリプトはコチラ。

function createEventForm(){
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
  var values = spreadsheet.getSheetByName('イベント概要').getDataRange().getValues();
  var formTitle = values[0][1]; //タイトル
  var formDescription = values[1][1]; //概要
  
  var form = FormApp.create(formTitle);
  
  var FOLDER_ID = PropertiesService.getScriptProperties().getProperty('FOLDER_ID');
  var formFile = DriveApp.getFileById(form.getId());
  DriveApp.getFolderById(FOLDER_ID).addFile(formFile);
  DriveApp.getRootFolder().removeFile(formFile);
  
  form.setDescription(formDescription);
  form.addTextItem().setTitle('氏名').setRequired(true);
  form.addTextItem().setTitle('会社名');
  
  var validationEmail = FormApp.createTextValidation().requireTextIsEmail().build();
  form.addTextItem().setTitle('メールアドレス').setRequired(true).setValidation(validationEmail);
  
  form.addMultipleChoiceItem()
    .setTitle('お持ちのPCのOSは?')
    .setChoiceValues(['Windows', 'Mac']);
}

順調に質問が増えていっていますね。

今回はチェックボックス形式の「興味があるプログラミング言語は?」という質問を追加していきます。

フォームにチェックボックスの質問を追加する

フォームにチェックボックスの質問を追加するには、FormオブジェクトにaddCheckboxItemメソッドを使います。

Formオブジェクト.addCheckboxItem()

これで追加するのですが、これだけでは質問のタイトルも選択項目も何もない状態ですので、色々と設定をしていく必要があります。

前述のaddCheckboxItemメソッドの戻り値は、チェックボックスの質問を表すCheckboxItemオブジェクトなので、このオブジェクトに対して設定をしていきます。

チェックボックスの質問のタイトルを設定する

チェックボックスの質問についてタイトルを設定をするにはsetTitleメソッドを使います。

CheckboxItemオブジェクト.setTitle(質問のタイトル)

もうsetTitleメソッドは全ての質問について必須のようなものですね。

チェックボックスの選択項目を設定する

チェックボックスの選択項目を設定するには、setChoiceValuesメソッドを使います。

CheckboxItemオブジェクト.setChoiceValues(選択肢の配列)

選択肢を文字列の配列として与えることで、その一つ一つを選択項目とすることができます。

ラジオボタンの場合と似ていますね。

チェックボックスにその他の選択肢を表示する

用意した以外の選択肢を回答される可能性があるのであれば、「その他」の項目を用意しておきたいですよね。

その場合に使えるのが、showOtherOptionメソッドです。

CheckboxItemオブジェクト.showOtherOption(表示するかどうか)

表示するかどうかは真偽値つまりtrueまたはfalseで指定します。ここでtrueを設定すれば、選択肢に「その他」が追加されます。

なお、デフォルトはfalseになっていますので、不要であればこのメソッドは使わずでOKです。

また、showOtherOptionメソッドはMultipleChoiceItemオブジェクト、つまりラジオボタン形式の質問にも使えますよ。

チェックボックスの質問を追加するスクリプト

以上を踏まえて、チェックボックス形式の「興味があるプログラム言語は?」の質問を追加します。

コードはこちらです。

function createEventForm(){
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
  var values = spreadsheet.getSheetByName('イベント概要').getDataRange().getValues();
  var formTitle = values[0][1]; //タイトル
  var formDescription = values[1][1]; //概要
  
  var form = FormApp.create(formTitle);
  
  var FOLDER_ID = PropertiesService.getScriptProperties().getProperty('FOLDER_ID');
  var formFile = DriveApp.getFileById(form.getId());
  DriveApp.getFolderById(FOLDER_ID).addFile(formFile);
  DriveApp.getRootFolder().removeFile(formFile);
  
  form.setDescription(formDescription);
  form.addTextItem().setTitle('氏名').setRequired(true);
  form.addTextItem().setTitle('会社名');
  
  var validationEmail = FormApp.createTextValidation().requireTextIsEmail().build();
  form.addTextItem().setTitle('メールアドレス').setRequired(true).setValidation(validationEmail);
  
  form.addMultipleChoiceItem()
    .setTitle('お持ちのPCのOSは?')
    .setChoiceValues(['Windows', 'Mac']);
  form.addCheckboxItem()
    .setTitle('興味があるプログラム言語は?')
    .setChoiceValues(['VBA', 'Google Apps Script', 'Python'])
    .showOtherOption(true);
}

実行すると以下のようなチェックボックスの質問が追加されたフォームを作成することができます。

GASでフォームにチェックボックス形式の質問を追加する

プレビューをしてみます。

GASでチェックボックスの質問を追加したフォームのプレビュー

その他にチェックして入力欄にカーソルをもっていくとフリーで入力できるようになっています。

まとめ

以上、GASでGoogleフォームにチェックボックス形式の質問を追加する方法についてお伝えしました。

ラジオボタンととっても似ていますね。当たり前か。

次回は、プルダウンリストの作り方です。

どうぞお楽しみに!

連載目次:GASでGoogleフォームを一発で作成するツールを作る

イベントの申し込みやアンケートにとっても便利なGoogleフォーム。スプレッドシートの入力内容をもとに、一発でフォームを作成するツールを作っていきます。
  1. GASでGoogleフォームを作成する最も簡単なスクリプト
  2. GASで作成したGoogleフォームを指定のフォルダに移動する方法
  3. GASでGoogleフォームに記述式の質問を追加する方法
  4. GASでGoogleフォームにメールアドレスの入力欄とバリデーションを追加する方法
  5. GASでGoogleフォームにラジオボタンの質問を追加する方法

【エクセルVBA】エクセルシートに一覧化された複数の連絡先に本文を変えつつOutlookでメールを一括送信する方法

$
0
0

エクセルvba,メール一括送信

みなさまこんにちは、ノグチです。

前回は、エクセルVBAからOutlookを操作して、エクセルシートに記入された内容を、メールの件名と本文にセットして、Outlookからメールを送信させる方法をご紹介しました。

【エクセルVBA】Outlookでメールを作成・送信する方法
エクセルシートに記入された件名や本文を、エクセルVBAによってOutlookのメールの件名と本文にセットしてメール送信する方法をご紹介しています。VBAでメールの送信ができれば、宛先に応じてメールの本文を変えつつ一斉に送信することもできますよ。

仕事の取引先にメールをする際、メールの冒頭には相手の会社名、部署名、担当者名を入れたりしますよね。

ビジネスメールのマナーとはいえ、1件、2件ならまだしも、10件、20件となってくると中々苦痛な作業です。

コピー&ペーストしたとしても、会社名や名前を間違ってコピペしてしまっていたらもう最悪です。

ミスの防止と手間削減のために、それ、エクセルVBAで自動化してしまいましょう!

今回は、前回ご紹介したエクセルVBAでメールを送信するコードにFor~Nextを加えて、エクセルシートに一覧化された複数のメールアドレスに、メール本文を変えつつメールを一括送信する方法をご紹介します!

エクセルシートに一覧化された送信先に一括でメールを送りたい

例えば、こちらのリスト。vba,エクセルシート,送信先

リストのD列にあるメールアドレスに、メールの本文にA列の会社名、B列の部署名、C列の担当者名を盛り込みつつ、メールを送信したいとします。

メール本文のテンプレートがこちらのシート。メール本文,エクセルシート,vba,outlook

B2セルにあるメール本文の冒頭に送信先シートにある会社名、部署名、担当者名を追加しつつ、メールを送っていきます。

本文を変えつつ複数メールアドレスにメールを一括送信するコード

上の送信先シートの送信先に、メール内容シートの本文と送信先シートの情報を結合させてメール送信するコードがこちら。

何も難しいことはありません。

前回の記事でご紹介したコードのCreateItemメソッドでMailItemオブジェクトを作成する部分からSendメソッドでメール送信する部分をFor~Next文で挟んで、With文とメール本文を加工するステップを修正しただけという、結構単純なコードです。

(CreateItemメソッドとMailItemオブジェクトについては、前回記事をご覧ください。)

Sub SendEmail()

Dim objOutlook As Outlook.Application
Dim i
Dim rowMax As Long
Dim wsList As Worksheet
Dim wsMail As Worksheet
Dim objMail As Outlook.MailItem

Set objOutlook = New Outlook.Application
Set wsList = ThisWorkbook.Sheets("送信先")
Set wsMail = ThisWorkbook.Sheets("メール内容")

With wsList

    '送信先の件数
    rowMax = .Cells(Rows.Count, 1).End(xlUp).Row

    '送信先の件数分繰り返す
    For i = 2 To rowMax
        Set objMail = objOutlook.CreateItem(olMailItem)
        With wsMail
            .To = wsList.Cells(i, 4).Value       'メール宛先
            .Subject = .Range("B1").Value        'メール件名
            .BodyFormat = olFormatPlain          'メールの形式
            .Body = wsList.Cells(i, 1).Value & vbCrLf & _
                         wsList.Cells(i, 2).Value & " " & _
                         wsList.Cells(i, 3).Value & " 様" & vbCrLf & vbCrLf & _
                        .Range("B2").Value              'メール本文
    
           objMail.Send
        End With
    Next i

    Set objOutlook = Nothing
    MsgBox "送信完了"

End With

End Sub

CreateItemメソッドの場所に注意

上のコードのご紹介文でも書いた通り、MailItemオブジェクトを作成するCreateItemメソッドは、For~Next文の中に書くようにします。

CreateItemメソッドでMailItemオブジェクトを作成するのは、言うなればOutlookで「新しいメール」ボタンをクリックしていることと同義です。

この処理がFor~Next文の中に無いと折角プロパティの指定をしても、そもそもプロパティをセットする「新しいメール」が無いのでエラーになってしまいます。

上のコードで作成されたメール

上のコードによって、Outlookで作成されたメールはこんな感じになります。

vba,meilitem,メール,outlook

宛先には送信先がセットされて、本文の冒頭は、メール内容シートの本文に送信先シートの会社名、部署名、担当者名が追加されていますね。

これで、メール本文を変えつつ複数の送信先へメール送信ができますよ!

最後に

今回は、エクセルシートに一覧化された連絡先に、本文を変えつつOutlookでメールの一斉送信をする方法をご紹介しました。

「メールを沢山送りたい、本文は定型文でいいけど、文頭だけは相手の名前を入れないと失礼…仕方ない、1件ずつコピペで本文を作ってメール送信しよう。」

これ、私が昔在籍していた総務担当者が実際にやっていたことなんです。

一言相談してもらえれば、今回の記事のような方法を伝えられたのにな…という反省の念を込めての今回の方法のご紹介でした。

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

連載目次:エクセルVBAでOutlookを操作してみよう!

エクセルVBAでOutlookのメール作成、送信やタスク登録などの操作をする方法をご紹介しています。メーラーとして便利なOutlookですが、VBAと組み合わせて更に便利に使ってしまいましょう。

  1. 【エクセルVBA】エクセルVBAでOutlookを操作しよう!参照設定とOutlookアプリケーションオブジェクトの取得
  2. 【エクセルVBA】Outlookでメールを作成・送信する方法

GASでGoogleフォームにプルダウンリストの質問を追加する方法

$
0
0

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

GASでGoogleフォームを一発で作成するツールを作成しています。

前回の記事はコチラ。

GASでGoogleフォームにチェックボックス形式の質問を追加する方法
GASでGoogleフォームを作成するツールを作成しています。今回は、CheckboxItemオブジェクト、つまりチェックボックス形式の質問を追加する方法をお伝えします。「その他」の項目も表示できますよ。

フォームにチェックボックスの質問を追加する方法についてお伝えしました。

今回は、プルダウンリストを作成していきます。

ということで、GASでGoogleフォームにプルダウンリストの質問を追加する方法、行ってみましょう!

前回のおさらい

前回までで作成したスクリプトはコチラです。

function createEventForm(){
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
  var values = spreadsheet.getSheetByName('イベント概要').getDataRange().getValues();
  var formTitle = values[0][1]; //タイトル
  var formDescription = values[1][1]; //概要
  
  var form = FormApp.create(formTitle);
  
  var FOLDER_ID = PropertiesService.getScriptProperties().getProperty('FOLDER_ID');
  var formFile = DriveApp.getFileById(form.getId());
  DriveApp.getFolderById(FOLDER_ID).addFile(formFile);
  DriveApp.getRootFolder().removeFile(formFile);
  
  form.setDescription(formDescription);
  form.addTextItem().setTitle('氏名').setRequired(true);
  form.addTextItem().setTitle('会社名');
  
  var validationEmail = FormApp.createTextValidation().requireTextIsEmail().build();
  form.addTextItem().setTitle('メールアドレス').setRequired(true).setValidation(validationEmail);
  
  form.addMultipleChoiceItem()
    .setTitle('お持ちのPCのOSは?')
    .setChoiceValues(['Windows', 'Mac'])
    .setRequired(true);

  form.addCheckboxItem()
    .setTitle('興味があるプログラム言語は?')
    .setChoiceValues(['VBA', 'Google Apps Script', 'Python'])
    .showOtherOption(true);
    .setRequired(true);
}

記述式で氏名、会社名、メールアドレス、ラジオボタン形式、チェックボックス形式とだいぶ立派になってきましたね。

今回はプルダウンリストで「お住いの都道府県は?」を追加していきます。

フォームにプルダウンの質問を追加する

フォームにプルダウンの質問を追加するには、FormオブジェクトにaddListItemメソッドを使います。

Formオブジェクト.addListItem()

もう、これまで記事をご覧になられてきた方には飽き飽きの展開ですね。

addListItemメソッドの戻り値は、ListItemオブジェクトになりますので、そのオブジェクトに質問タイトルとか、必須かどうかとか、選択肢とかを追加してばいいんでしょ?

てなわけですが、そのとおり!

プルダウンリストの質問のタイトルを設定する

プルダウンリストの質問のタイトルを設定するには、setTitleメソッドです。

プルダウンリストの質問の設定をするのであれば、その対象となるオブジェクトはListItemオブジェクトになります。

ListItemオブジェクト.setTitle(質問のタイトル)

プルダウンリストの選択項目を設定する

プルダウンリストの選択項目を設定するには、setChoiceValuesメソッドを使います。

これもラジオボタンやチェックボックスと同様ですね。

ListItemオブジェクト.setChoiceValues(選択肢の配列)

文字列の配列で選択肢を設定すればOKです。

プルダウンリストの質問の回答を必須にする

プルダウンリストの質問の回答を必須にするには、setRequiredメソッドですね。

ListItemオブジェクト.setRequired(必須かどうか)

引数は、trueまたはfalseで設定します。

フォームにプルダウンリストの質問を追加をするスクリプト

以上を踏まえて、プルダウンリストの質問を追加したスクリプトがコチラです。

function createEventForm(){
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
  var values = spreadsheet.getSheetByName('イベント概要').getDataRange().getValues();
  var formTitle = values[0][1]; //タイトル
  var formDescription = values[1][1]; //概要
  
  var form = FormApp.create(formTitle);
  
  var FOLDER_ID = PropertiesService.getScriptProperties().getProperty('FOLDER_ID');
  var formFile = DriveApp.getFileById(form.getId());
  DriveApp.getFolderById(FOLDER_ID).addFile(formFile);
  DriveApp.getRootFolder().removeFile(formFile);
  
  form.setDescription(formDescription);
  form.addTextItem().setTitle('氏名').setRequired(true);
  form.addTextItem().setTitle('会社名');
  
  var validationEmail = FormApp.createTextValidation().requireTextIsEmail().build();
  form.addTextItem().setTitle('メールアドレス').setRequired(true).setValidation(validationEmail);
  
  form.addMultipleChoiceItem()
    .setTitle('お持ちのPCのOSは?')
    .setChoiceValues(['Windows', 'Mac'])
    .setRequired(true);

  form.addCheckboxItem()
    .setTitle('興味があるプログラム言語は?')
    .setChoiceValues(['VBA', 'Google Apps Script', 'Python'])
    .showOtherOption(true);
    .setRequired(true);

  form.addListItem()
    .setTitle('お住まいの都道府県は?')
    .setChoiceValues(prefValues)
    .setRequired(true);

}

都道府県の配列をprefValuesとしていますが、都道府県…47ありますよね?

それをスクリプトにベタ打ちするのは面倒です。

この配列を作る部分は次回の記事でお伝えしていきます。

まとめ

以上、GASでGoogleフォームにプルダウンリストの質問を追加する方法をお伝えしました。

記述式、ラジオボタン、チェックボックス、プルダウンリスト…だいたいノリは一緒ですね。

ここまでやればだいぶFormsサービスのパターンが見えてきますね。

さて、都道府県のリストを作る部分ですが、ここはスプレッドシートから取得して構成していければと思います。

その部分は、次回の記事でお伝えしていきますね。

どうぞお楽しみに!

連載目次:GASでGoogleフォームを一発で作成するツールを作る

イベントの申し込みやアンケートにとっても便利なGoogleフォーム。スプレッドシートの入力内容をもとに、一発でフォームを作成するツールを作っていきます。
  1. GASでGoogleフォームを作成する最も簡単なスクリプト
  2. GASで作成したGoogleフォームを指定のフォルダに移動する方法
  3. GASでGoogleフォームに記述式の質問を追加する方法
  4. GASでGoogleフォームにメールアドレスの入力欄とバリデーションを追加する方法
  5. GASでGoogleフォームにラジオボタンの質問を追加する方法
  6. GASでGoogleフォームにチェックボックス形式の質問を追加する方法

Googleフォームの質問の選択肢をスプレッドシートのデータから生成するGAS関数の作り方

$
0
0
choices

photo credit: Dean Hochman hobby lobby via photopin (license)

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

GASでGoogleフォームを一気に作成するツールを作成しています。

前回の記事はコチラです。

GASでGoogleフォームにプルダウンリストの質問を追加する方法
GASでGoogleフォームを一発で作成するツールを作成しています。今回は、プルダウンリストを作成していきます。GASでGoogleフォームにスプレッドシートからの選択肢をもとにプルダウンリストを追加する方法です。

プルダウンリストの質問を追加する方法をお伝えしました。

さて、そのプルダウンですが「お住まいの都道府県は?」という質問にしたいんですね。

てことは、選択肢が47あります。

スクリプト内に配列要素をベタ打ちするの、ちょっと面倒ですね。

ということで、今回はGoogleフォームの質問の選択肢をスプレッドシートのデータから生成するGAS関数の作り方です。

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

前回までのおさらい

前回までに作成したスクリプトはコチラです。

function createEventForm(){
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
  var values = spreadsheet.getSheetByName('イベント概要').getDataRange().getValues();
  var formTitle = values[0][1]; //タイトル
  var formDescription = values[1][1]; //概要
  
  var form = FormApp.create(formTitle);
  
  var FOLDER_ID = PropertiesService.getScriptProperties().getProperty('FOLDER_ID');
  var formFile = DriveApp.getFileById(form.getId());
  DriveApp.getFolderById(FOLDER_ID).addFile(formFile);
  DriveApp.getRootFolder().removeFile(formFile);
  
  form.setDescription(formDescription);
  form.addTextItem().setTitle('氏名').setRequired(true);
  form.addTextItem().setTitle('会社名');
  
  var validationEmail = FormApp.createTextValidation().requireTextIsEmail().build();
  form.addTextItem().setTitle('メールアドレス').setRequired(true).setValidation(validationEmail);
  
  form.addMultipleChoiceItem()
    .setTitle('お持ちのPCのOSは?')
    .setChoiceValues(['Windows', 'Mac'])
    .setRequired(true);

  form.addCheckboxItem()
    .setTitle('興味があるプログラム言語は?')
    .setChoiceValues(['VBA', 'Google Apps Script', 'Python'])
    .showOtherOption(true);
    .setRequired(true);

  form.addListItem()
    .setTitle('お住まいの都道府県は?')
    .setChoiceValues(prefValues)
    .setRequired(true);

}

だいぶ長くなりましたね。

34行目のsetChoiceValuesメソッドですが、まだ引数として渡す変数prefValuesの定義ができていません。

この変数には、「お住いの都道府県は?」の回答の選択肢の配列をセットする必要がありますね。

47都道府県をスクリプトベタ打ちは大変ですので、スプレッドシートの入力値から配列を生成をしていきたいと思います。

また、それと合わせて、23行目のラジオボタン、28行目のチェックボックスも、スプレッドシートの入力値から配列を生成しますね。

スプレッドシートに選択肢のデータを準備

まず、スプレッドシートに以下のようなシートを追加で用意します。

スプレッドシートに項目データのシートを準備する

「項目データ」というシート名で

  • A列:OS
  • B列:プログラム言語
  • C列:都道府県

のデータを列挙したものです。

それぞれの列に存在するデータを、対応するフォームの質問の選択肢として使用していきます。

シートの項目データから選択肢の配列を生成する

まず、以下のスクリプトにより、「項目データ」シートのデータを二次元配列として格納します。

var dataValues = spreadsheet.getSheetByName('項目データ').getDataRange().getValues();

そして、この二次元配列dataValuesと、列数を渡すことで、その列のデータを一次元配列に格納する関数generateArrayを作りました。

コチラです。

/**
 * シート全体の値を取得した二次元配列から、指定の列のデータ(見出し行を除く)を抜き出し一次元配列を構成する
 *
 * @param {Object[][]} シートのデータを二次元配列化した配列
 * @param {number} 配列の列数(0以上のインデックス)
 * @return {Object[]} 指定の列(見出しを除く)のデータによる一次元配列
 */
function generateArray(values, column){
  var i = 1;
  var array = [];
  for(var i = 1; i < values.length; i++){
    if(values[i][column]){
      array.push(values[i][column]);
    }
  }
  return array;
}

columnには0以上のインデックス値を渡します。

values[i][column]がtrueであれば(つまり、意味のあるデータが含まれていれば)、pushメソッドにより配列arrayにそのデータが追加されていきます。

空文字などのデータであれば、values[i][column]はfalseになりますから、配列には何の変化も与えられません。

例えば、A列のOSのデータを生成したければ、「0」を指定して

var osValues = generateArray(dataValues, 0); //OS

というふうに呼び出せばOKです。

すると、[Windows, Mac]という配列が戻り値として与えられるということになるはずです。

フォームの選択肢の生成を関数化したスクリプト

以上を踏まえて、各質問についてスプレッドシートから選択肢を取得するように、スクリプトを修正してみました。

こちらです。

function createEventForm(){
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
  var values = spreadsheet.getSheetByName('イベント概要').getDataRange().getValues();

  var dataValues = spreadsheet.getSheetByName('項目データ').getDataRange().getValues();
  var osValues = generateArray(dataValues, 0); //OS 
  var langValues = generateArray(dataValues, 1); //プログラム言語
  var prefValues = generateArray(dataValues, 2); //都道府県

  var formTitle = values[0][1]; //タイトル
  var formDescription = values[1][1]; //概要
  
  var form = FormApp.create(formTitle);
  
  var FOLDER_ID = PropertiesService.getScriptProperties().getProperty('FOLDER_ID');
  var formFile = DriveApp.getFileById(form.getId());
  DriveApp.getFolderById(FOLDER_ID).addFile(formFile);
  DriveApp.getRootFolder().removeFile(formFile);
  
  form.setDescription(formDescription);
  form.addTextItem().setTitle('氏名').setRequired(true);
  form.addTextItem().setTitle('会社名');
  
  var validationEmail = FormApp.createTextValidation().requireTextIsEmail().build();
  form.addTextItem().setTitle('メールアドレス').setRequired(true).setValidation(validationEmail);
     
  form.addMultipleChoiceItem()
    .setTitle('お持ちのPCのOSは?')
    .setChoiceValues(osValues)
    .setRequired(true);
    
  form.addCheckboxItem()
    .setTitle('興味があるプログラム言語は?')
    .setChoiceValues(langValues)
    .showOtherOption(true)
    .setRequired(true);
    
  form.addListItem()
    .setTitle('お住まいの都道府県は?')
    .setChoiceValues(prefValues)
    .setRequired(true);
}

/**
 * シート全体の値を取得した二次元配列から、指定の列のデータ(見出し行を除く)を抜き出し一次元配列を構成する
 *
 * @param {Object[][]} シートのデータを二次元配列化した配列
 * @param {number} 配列の列数(0以上のインデックス)
 * @return {Object[]} 指定の列(見出しを除く)のデータによる一次元配列
 */
function generateArray(values, column){
  var i = 1;
  var array = [];
  for(var i = 1; i < values.length; i++){
    if(values[i][column]){
      array.push(values[i][column]);
    }
  }
  return array;
}

44行目以降が、フォームの質問の選択肢を作るための関数generateArrayです。

メインの関数createEventFormについては、5~8行目が追加されたポイントですね。

まず、「項目データ」シートのデータを二次元配列として取得しつつ、各列について選択肢の配列を生成しています。

上記スクリプトを実行すると、以下のようなフォームが作成されます。

フォームの各質問の選択肢

プルダウンをクリックすると、以下のように全ての都道府県の選択肢が含まれていることが確認できます。

フォームのプルダウンリストで都道府県を選択する

まとめ

以上、GASでGoogleフォームの質問の選択肢をスプレッドシートのデータから構成する方法をお伝えしました。

質問とその選択肢が増えても、ちょちょっとスクリプトに追加すればOKですね。

あ、今回紹介したのは、あくまで新規フォームの作成時の選択肢の取得ですからね。既に作成してあるフォームの選択肢を変更したいのであれば、スクリプトの作り方もちょっと変わります。

さて、次回ですが、その他色々なフォームの質問とその作り方について紹介します。

どうぞお楽しみに!

連載目次:GASでGoogleフォームを一発で作成するツールを作る

イベントの申し込みやアンケートにとっても便利なGoogleフォーム。スプレッドシートの入力内容をもとに、一発でフォームを作成するツールを作っていきます。
  1. GASでGoogleフォームを作成する最も簡単なスクリプト
  2. GASで作成したGoogleフォームを指定のフォルダに移動する方法
  3. GASでGoogleフォームに記述式の質問を追加する方法
  4. GASでGoogleフォームにメールアドレスの入力欄とバリデーションを追加する方法
  5. GASでGoogleフォームにラジオボタンの質問を追加する方法
  6. GASでGoogleフォームにチェックボックス形式の質問を追加する方法
  7. GASでGoogleフォームにプルダウンリストの質問を追加する方法
  8. Googleフォームの質問の選択肢をスプレッドシートのデータから生成するGAS関数の作り方

PythonでPhantomJs Cloudを利用してWebページをスクレイピング

$
0
0

Python-and-PhantomJsCloud

みなさん、こんにちは!うえはら(@tifoso_str)です。

JavaScriptで動作するWebページを色々な言語でスクレイピング】するシリーズの第六弾です。

第四弾では「GASでPhantomJS Cloudを利用してWebページをスクレイピング」しました。

GASでPhantomJS Cloudを利用してWebページをスクレイピング
「JavaScriptで動作するWebページ(動的サイト)を色々な言語でスクレイピング」することをシリーズでお伝えしています。 今回はGoogle Apps ScriptとPhantomJS Cloudでスクレイピングします!

また、第二弾では「VBAでIEを操作してJavaScriptで動作するWebページをスクレイピング」しました。 

VBAとGoogle Apps Scriptでスクレイピング出来れば、実務では事足りるもしれませんが、プログラムの世界ではPythonの人気が上がってきています。

非エンジニアのWindows派がPythonを始めるメリットをこれでもかと説明します
Pythonを学ぶことは、非エンジニアのプログラミング初心者、一般のビジネスマン、Windowsユーザーにとって有益です。今回はPythonとは何か?そしてそれを学ぶメリットについてお伝えしていきます。

そこで今回より、PythonでJavaScriptで動作するWebサイトをスクレイピングする方法を紹介します。

Pythonでスクレイピングする方法は別連載でもお伝えしていますので、併せて確認お願いします。

Pythonでスクレイピングをする最初の一歩、Webページを丸ごと取得する方法
Windowsを使う初心者向けにPythonの情報を提供しています。今回は、Pythonでスクレイピングをする最初の一歩、requestsモジュールのget関数でWebページを丸ごと取得する方法です。

PythonでJavaScriptで動作するWebサイトをスクレイピングする方法はいくつかありますが、今回はGASからの流れで「PythonでPhantomJs Cloudを利用してWebページをスクレイピング」していきます。

前回までのおさらい

前回までの分を簡単におさらいします。

まず、Phantom Js Cloudですが、これはクラウドで動作するヘッドレスブラウザです。

簡単に言うと、スクレイピングしたいURLをわたすと、JavaScriptが実行された後のHTMLドキュメントを返してくれるサービスです。

GASでPhantomJS Cloudを利用してWebページをスクレイピングするスクリプトは下記のようになります。

function scraping() {
 
  const URL = 'https://www.eb.pref.okinawa.jp/kassui/';//沖縄県企業局のダム貯水率 
  var key = '**-#####-*****-#####-*****-#####';
  
  var option = 
      {url:URL,
       renderType:"HTML",
       outputAsJson:true};
  var payload = JSON.stringify(option);
  payload = encodeURIComponent(payload);
  var url = "https://phantomjscloud.com/api/browser/v2/"+ key +"/?request=" + payload;                
  var response = UrlFetchApp.fetch(url);
 
  var json = JSON.parse(response.getContentText()); 
  var source = json["content"]["data"];
  
  var myRegexp = /<title>([\s\S]*?)<\/title>/;
  var title = source.match(myRegexp);
  Logger.log(title[1]);
  
  var myRegexp = /<span id=\"chosui_hiduke\">([\s\S]*?)<\/span>/;
  var day = source.match(myRegexp);
  Logger.log(day[1]);
  
  var myRegexp = /id=\"ritsu_today4\">([\s\S]*?)<\/td>/;
  var waterRate = source.match(myRegexp);
  Logger.log(waterRate[1]);

}

今回のシリーズでは、沖縄県のダムの貯水率をスクレイピングで取得しています。

結果は下記のようになります。

phantomJS_最終ログ確認

これと同じ事をPythonでやってみます。

PhantomJsCloudにアクセスするURLの作成

PhantomJs CloudにアクセスするURLは下記のようになります。

http(s)://PhantomJsCloud.com/api/browser/v2/[YOUR-KEY]/?request=[REQUEST-JSON]

[YOUR-KEY]はApiKeyを、[REQUEST-JSON]にはスクレイピングしたいURL等のオプションを指定すればよかったですね。

また、[REQUEST-JSON]はJSON形式をURIエンコードする必要がありました。

リクエストのJSON変換について

PythonでJSON形式を扱うときは標準モジュールのJSONモジュールを使います。

JSONモジュールを使用することで、JSON形式とPythonの辞書型を簡単に変換できます。

今回はPythonの辞書型からJSON形式へ変換するので、json.dumps関数を利用します。

json.dumps(辞書型)

実際のコードは下記のようになります。

import json
payload = {'url':'https://www.eb.pref.okinawa.jp/kassui/','renderType':'HTML','outputAsJson':'true'}
payload = json.dumps(payload) #JSONパース
print(payload)

実行すると下記のようにJSON形式で表示されます。

Python_JOSN変換結果

URIエンコードについて

次は、JSON形式のリクエスト部分をURIエンコードします。

PythonでURL関係を操作するときは、標準モジュールのurllib.parseモジュールを使います。

今回はURIエンコードするのにurllib.parse.quote関数を利用します。

urllib.parse.quote(文字列,オプション)

実際のコードは下記のようになります。

import json
import urllib.parse

payload = {'url':'https://www.eb.pref.okinawa.jp/kassui/','renderType':'HTML','outputAsJson':'true'}
payload = json.dumps(payload) #JSONパース
payload = urllib.parse.quote(payload,safe = '') #URIエンコード
print(payload)

urllib.parse.quote関数のオプションでデフォルトは「safe = ‘/’」となっていて、「/」はエンコードしないという意味です。

PhantomJS Cloudでは「/」もエンコードする必要があるので、今回はオプションで「/」をはずしています。

オプション有りと無しで実行した結果が下記となります。

Python_URI変換結果

オプション指定した上の方は「/」が「%2F」に変換されています。

PhantomJsCloudにHTTPリクエストする

PythonでHTTPリクエストするときには、requestsモジュールを使うと簡単にできます。

requestsモジュールは標準モジュールではないので、インストールする必要があります。

詳細は下記の記事をご参照下さい。

Pythonでスクレイピングをする最初の一歩、Webページを丸ごと取得する方法
Windowsを使う初心者向けにPythonの情報を提供しています。今回は、Pythonでスクレイピングをする最初の一歩、requestsモジュールのget関数でWebページを丸ごと取得する方法です。

PythonでGetリクエストをするときは、requests.get関数を利用します。

requests.get(URL)

コードは下記のようになります。

import json
import urllib.parse
import requests

payload = {'url':'https://www.eb.pref.okinawa.jp/kassui/','renderType':'HTML','outputAsJson':'true'}
payload = json.dumps(payload) #JSONパース
payload = urllib.parse.quote(payload,safe = '') #URIエンコード

key = '**-#####-*****-#####-*****-#####'
url = "https://phantomjscloud.com/api/browser/v2/"+ key+"/?request=" + payload

response = requests.get(url) #GETリクエスト
print(response.text)

最後の行は結果を確認しています。

requests.get関数の戻り値のResponseオブジェクトからデータを取り出すときは下記のようにします。

Responseオブジェクト.text

Python_実行結果

内容はよく分かりませんが、GASで実行したときと同じように、データは取得できました。

まとめ

今回はPythonでPhantomJs Cloudを利用してWebページをスクレイピングしました。

GASと同じように色々な関数があるので、Pythonでも同じような書き方で実行できますね。

PhantomJs Cloudからのデータは取得できたので、次回は必要部分を抜き出すためにBeautiful Soupモジュールを使います。

お楽しみに!

連載目次:JavaScriptで動作するWebページを色々な言語でスクレイピング

Webスクレイピングしていて、値が取得できないということはありませんか?

そんな時は、Webサイトの表示にJavaScriptを利用しているからです。

本連載では、色々な言語でその対応をご紹介します!

  1. GASやVBAでスクレイピングができない理由として考えるべきJavaScriptのこと
  2. VBAでIEを操作してJavaScriptで動作するWebページをスクレイピング
  3. GASでJavaScriptで動作するWebページをスクレイピングするPhantomJsとは
  4. GASでPhantomJSを利用してWebページをスクレイピング
  5. GASでスクレイピングしたデータからmatchメソッドと正規表現を使って目的の値を取得
  6. PythonでPhantomJs Cloudを利用してWebページをスクレイピング

GASでGoogleフォームに追加できる質問の種類とそのメソッドまとめ

$
0
0
question-mark

photo credit: M i x y que? via photopin (license)

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

GASでGoogleフォームを作成する方法についてお伝えしています。

前回の記事はコチラ。

Googleフォームの質問の選択肢をスプレッドシートのデータから生成するGAS関数の作り方
GASでGoogleフォームを一気に作成するツールを作成しています。今回はGoogleフォームの質問の選択肢をスプレッドシートのデータから生成するGAS関数の作り方について解説をしていきます。

スプレッドシートからフォームの質問の選択肢を生成する関数の作り方を解説しました。

さて、前回まででGoogleフォームをGASで作るツールとしてはだいたい完成という感じなのですが、フォームの質問の種類って他にもたくさんありますよね。

ということで、今回はGoogleフォームの質問の種類と、それらを作るGASのメソッドをまとめて紹介したいと思います。

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

Googleフォームの色々な質問を作成するスクリプト

これまでの連載のパターンで、フォームに質問を追加するのは、Formオブジェクトのaddなんちゃらメソッドである、というのはつかんでいます。

なので、公式ドキュメントからそれ系のメソッドを一通り引っ張ってきて、実行してみたいと思います。

こんなスクリプトを作りました。

function addFormItems(){
  var formTitle = 'フォームの各質問の追加テスト';  
  var form = FormApp.create(formTitle);

  //保存するフォルダの指定
  var FOLDER_ID = PropertiesService.getScriptProperties().getProperty('FOLDER_ID');
  var formFile = DriveApp.getFileById(form.getId());
  DriveApp.getFolderById(FOLDER_ID).addFile(formFile);
  DriveApp.getRootFolder().removeFile(formFile);
  
  form.addTextItem().setTitle('TextItem'); //記述式
  form.addMultipleChoiceItem().setTitle('MultipleChoiceItem'); //ラジオボタン
  form.addCheckboxItem().setTitle('CheckboxItem'); //チェックボックス   
  form.addListItem().setTitle('ListItem'); //プルダウンリスト
  
  form.addPageBreakItem().setTitle('PageBreakItem');
  
  form.addParagraphTextItem().setTitle('ParagraphTextItem');

  form.addScaleItem().setTitle('ScaleItem');
  form.addGridItem().setTitle('GridItem');
  form.addCheckboxGridItem().setTitle('CheckboxGridItem');
  
  form.addDateItem().setTitle('DateItem');
  form.addTimeItem().setTitle('TimeItem');
  form.addDateTimeItem().setTitle('DateTimeItem');
  form.addDurationItem().setTitle('DurationItem');

}

11~14行目までは、これまで登場した質問を追加するメソッドですね。

16行目以降は、メソッド名でなんとなくこれかな?と思えるものと、全く想像ができないものと…

ちなみに、引数には各メソッドにより生成され戻り値として渡されるオブジェクトのクラス名です。

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

フォームの色々な質問をGASで作成した結果

1画面目

まず、編集画面とプレビュー画面がコチラです。

GASで作成したフォームの編集画面その1

GASで作成したフォームのプレビュー画面その1

まずはこれまでに登場した質問たちですね。

  • TextItem: 記述式
  • MultipleChoiceItem: ラジオボタン
  • CheckboxItem: チェックボックス
  • ListItem: プルダウンリスト

最後に「次へ」ボタンがあるのがちょっと気になりますね…

2画面目

続いて、2画面目の編集画面とプレビュー画面です。

GASで作成したフォームの編集画面その2

GASで作成したフォームのプレビュー画面その2

この質問たちは以下のようなものです。

  • PageBreakItem: ページの切り替え
  • ParagraphTextItem: 段落記述式
  • ScaleItem: 数値形式の一連のラジオボタン
  • GridItem: 行列型のラジオボタン
  • CheckboxGridItem: 行列型のチェックボックス

3画面目

最後の3画面目の編集画面とプレビュー画面です。

GASで作成したフォームの編集画面その3

お?なんとなくアイコンからして日付や時間系ですね。

GASで作成したフォームのプレビュー画面その3

3画面目に登場した質問は以下になります。

  • DateItem: 日付
  • TimeItem: 時刻
  • DateTimeItem: 日付と時刻
  • DurationItem: 経過時間

GASで作成できる質問とそのメソッドのまとめ

以上で、フォームにどのような質問を追加できるかがわかりましたよね?

フォームで追加できる質問とそのオブジェクトのクラス名、そして追加するメソッドをまとめると以下のようになります。

質問の種類 クラス名 追加するメソッド
記述式 TextItem addTextItemメソッド
ラジオボタン MultipleChoiceItem addMultipleChoiceItemメソッド
チェックボックス CheckboxItem addCheckboxItemメソッド
プルダウンリスト ListItem addListItemメソッド
ページの切り替え PageBreakItem addPageBreakItemメソッド
段落記述式 ParagraphTextItem addParagraphTextItemメソッド
数値形式の一連のラジオボタン ScaleItem addScaleItemメソッド
行列型のラジオボタン GridItem addGridItemメソッド
行列型のチェックボックス CheckboxGridItem addCheckboxGridItemメソッド
日付 DateItem addDateItemメソッド
時刻 TimeItem addTimeItemメソッド
日付と時刻 DateTimeItem addDateTimeItemメソッド
経過時間 DurationItem addDurationItemメソッド

まとめ

以上、GASでGoogleフォームに追加できる質問の種類とそのメソッドまとめについてお伝えしました。

あとは、もちろん、これらのメソッドについて質問のタイトルや選択肢などを追加していく必要がありますね。

ぜひ、公式ドキュメントを調べながらトライしていただければと思います。

また、便利なツールについて思いついたら記事にしますね。

どうぞお楽しみに!

連載目次:GASでGoogleフォームを一発で作成するツールを作る

イベントの申し込みやアンケートにとっても便利なGoogleフォーム。スプレッドシートの入力内容をもとに、一発でフォームを作成するツールを作っていきます。
  1. GASでGoogleフォームを作成する最も簡単なスクリプト
  2. GASで作成したGoogleフォームを指定のフォルダに移動する方法
  3. GASでGoogleフォームに記述式の質問を追加する方法
  4. GASでGoogleフォームにメールアドレスの入力欄とバリデーションを追加する方法
  5. GASでGoogleフォームにラジオボタンの質問を追加する方法
  6. GASでGoogleフォームにチェックボックス形式の質問を追加する方法
  7. GASでGoogleフォームにプルダウンリストの質問を追加する方法
  8. Googleフォームの質問の選択肢をスプレッドシートのデータから生成するGAS関数の作り方

独立して3年、なぜどのようにプログラミングスキルを磨いてきたのか #ノンプロ研

$
0
0
way-walk

photo credit: www.holgersbilderwelt.de Dune 45 / Düne 45 (Sossusvlei/Namibia) via photopin (license)

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

プログラミングを学ぶ際、今やりたいこと、今やるべきことは、当然ながらある程度見えていますよね。

ですが、例えば3年後は想像できますか?

どのようなスキルを、どのように身に着けて、どのように活用しているでしょうか?

ちょうど私自身が独立してから3年間、独立を決めてから3年半という期間、プログラミングスキルを磨きながら過ごしてきました。

今回は、それを元に、なぜどのようにプログラミングスキルを磨いてきたのか、またそこからわかったことについてお伝えしたいと思います。

※この記事はコミュニティ「ノンプログラマーのためのスキルアップ研究会」定例会Vol.8「向こう3年のスキルアッププランを考える」の内容の一部を加筆修正して記事にしたものです。セミナーからの抜粋動画もあります(一部音声が乱れて、聴きづらい箇所がありますが、ご了承ください)ので、合わせてご参考くださいね。当日の様子は以下のツイートまとめもご覧くださいませ。

ノンプロ研定例会Vol.8 「向こう3年のスキルアッププランを考える」
プログラミングを学ぶ際、今やりたいこと、今やるべきことはよく見えています。ですが、3年後は想像できますか?今回は、ノンプログラマーTさんが独立してから3年半、どのようなスキルを、どのように身に着け..

なぜスキルを磨こうと思ったのか

独立する意志をかため、このブログの更新を始めたのは2015年の2月、そして実際に独立をしたのは2015年の6月です。

独立前は電子書籍業界でサラリーマンをしていましたが、とてもルーチンのエクセル仕事の多い業界でした。

ですから、VBAでちょちょっとツールを作れば、毎月の固定費を永続的に減らせる…VBAマクロ開発のお仕事を獲得するという視点でいうと、費用対効果で簡単にメリットを示せたんですね。

だから、もともと持っていたスキルと、その宣伝をするブログ+WordPressのスキルさえ身につければなんとかなるだろう…当初はそんなふうに考えていました。

そのときの、私のスキルの様子を示すスライドがコチラですね。

2015年2月当時の高橋のスキル

Excel VBA一本足打法。

今、改めてみると…無謀ですね。

ちなみに、各配色には以下のような意味があります。

  • 濃い緑: 仕事ができる技術系のスキル
  • 緑: 仕事が来てもいいくらいの技術系のスキル
  • 薄い緑: これから学ぼうとしている技術系のスキル
  • 濃いオレンジ: 仕事ができる表現系のスキル
  • オレンジ: 仕事が来てもいいくらいの表現系のスキル
  • 薄いオレンジ: これから学ぼうとしている表現系のスキル

ところがどっこい、思っていたよりも仕事を獲得するのははるかに困難でした。

敵は現状維持バイアスです。

審議経路に「変わりたくない・変わらせたくない」人物がいると、あれこれ理由をつけて却下をしてしまうのです。

大変です。このままでは生きてはいけない…

そんな私が考えたのは、自分のスキルを上げることで提供できるサービスを増やすことでした。

ということで、こんな記事を書いていました。2015年の10月のことです。

アラフォーの私が今さらながらプログラマーを目指している理由
お仕事効率化をテーマに起業をしてからしばらく経ちました。そこで確信したことがあります。私はプログラマーになるしかない!と。なぜそう確信するに至ったか、その理由を3つほど挙げようと思います。

これが、自分のスキルアップ人生のはじまりです。

3年間、スキルを磨いてわかったこと

そんなきっかけでスキルを磨くことを続けてきたわけですが、今現在のスキルは以下のような状態です。

2018年7月時点の高橋のスキル

だいぶ増えましたね…!

こうしてやってみてわかったことが3つあります。

  1. スキルが増えれば仕事も増える
  2. 依頼があったらなんとかモノにする
  3. 大きく花開かせるには長い年月が必要

2つ目ですが、依頼を受けた時点でスキルにないことでも、背伸びすればできそうなのであれば「できます!」と言って受けちゃうのはオススメです。

スキルも増えるし、報酬ももらえる、一石二鳥です。若干のリスクはありますが、たいがいなんとかします。

ただ、安定的な仕事になるとか、ビッグチャンスが発生するとか、そういうのはある程度の年月が必要です。スキルを身につけること自体もそうですし、世間がそれを認めてくれるようになるのには、時間がかかります。

感覚的には、結果は学び始めてから1年とかそういう単位で時が過ぎるとやってくるというイメージでいます。

スキルはたくさん手を出して、適宜絞る

前述のスライドだとかなりの多くのスキルを並行して学んでいるように見えますが、実はそうではありません。

継続して学ぶスキルについては、かなり絞り込んでいて、以下のような感じです。

2018年7月時点で継続して取り組んでいるスキル

さすがに、広げたスキル全てを並行して学ぶのは難しいですからね。

なので、「このスキル、手を出してみよう」と新たなスキルに手を出すこともしますが、それ以上に「このスキルはいったん置いておこう」と絞る判断もしています。

その際に、以下の5つを条件にしています。

  1. コンセプトとの距離に近いか
  2. ニーズがあるか
  3. 今のスキルセットとの距離が近いか
  4. 組み合わせがききそうか
  5. 次の展開がありそうか

コンセプトですが、私の場合は「ホワイトカラーの働く価値を上げる」というテーマがあるので、それに直結するスキルを優先します。もちろん、ニーズがないものはコンセプトに合致していても後回しにします。

また、今のスキルセットに近いものは、常に目を光らせておいて、タイミングを見てパクつくようにしています。また、そのスキルを踏み台にすることで、どの領域に手が届きそうかというのも考えます。それが、次の展開という話ですね。

組み合わせは、それこそ「技術系×表現型」というような組み合わせのことです。

私の場合、Web執筆、書籍執筆、研修、動画解説という表現系のスキルがありますので、技術系の開発スキルを一つ身に付けると

  • ×Web執筆
  • ×書籍執筆
  • ×研修
  • ×動画解説

というように、掛け算で価値提供できる領域が増えるのです。これはホントオススメです。

以下の動画で、3と4について解説していますので、よろしければ合わせてご覧ください。

まとめ

以上、私が独立してから3年間のスキルアップの軌跡と、その結果わかったことについてお伝えしました。

結論としては、「3年間のプラン」というものは存在しませんね。

常に目を光らせて、さっと手をつけて、シュッと精査する…そういう素早い選択の連続なのかなと思います。

さて、あと何十年もあるとなると、スキルの図はどんな風になっちゃうのか、興味ありますね。

定期的にスキル習得の軌跡、チェックしてみるのも良いかも知れませんね。

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

コミュニティ「ノンプログラマーのためのスキルアップ研究会」では、毎月1回、学びの質やモチベーションを高めるための定例会を開催していますので、こちらで過去のレポートをお送りしています。 また、定例会のプレゼン動画は以下のショップにて完全版を販売していきますので、こちらもどうぞご活用くださいませ。 BASEショップ「ノンプログラマーのためのスキルアップ研究会」

エクセルVBAでテーブル操作~そのメリットと変換方法&ListObjectの取得

$
0
0
table

photo credit: thekevinchang via photopin (license)

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

エクセルですが便利なのに、なぜか使われていないように思える機能として「テーブル」があります。

テーブル…ご存知…です…よね?

ということで、今回からシリーズで、エクセルVBAでテーブルを操作する方法について、テーブルが知らない!ってくらいの人でもわかるように、解説をしていきます。

題材は、請求書を作成するマクロを目指します。以下の記事から始まる人気の請求書シリーズのテーブル版です。

【初心者向けエクセルVBA】データ一覧から請求書を自動で作る
初心者向けVBAの実用的な使い方について、請求データ一覧から請求書を自動で作成するを目標に進めます。初回はWorksheetオブジェクト、Rangeオブジェクトと、セルの値の操作についてお伝えします。

まず、初回である本記事では、テーブルとは何か?エクセルのデータリストをテーブルに変換する方法から、VBAでテーブルをオブジェクトとして取得するまでをお伝えしていきますよ。

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

テーブルとは?またそのメリットは?

エクセルで作成した表は、「テーブル」に変換することができます。

エクセルの表をテーブルに変換すると

  • 並べ替え
  • オートフィルター
  • 行や列の追加・挿入・削除
  • 集計行の追加
  • 簡単にピボットテーブルを作成
  • スタイルによる書式設定

など、様々な便利機能を味わうことができます。

「…なんだ、スタイル以外は普通のエクセルシートの機能でもできるじゃん」って思いました?

いえ、違うんですよ。

シートにただ作った縦横の表はあくまで、セル範囲に記載されたデータの羅列でしかないですよね?

どこからどこまでデータがあって、どこが見出し行で…というのは、ユーザー側が把握(データの有無で判断したりしますよね)してあげないといけません。

ですが、テーブル化すれば、エクセルがテーブルをひとまとまりで管理してくれるようになります。

行や列を追加しても、それを「テーブル内のもの」としてエクセルが把握してくれています。

見出し行、集計行がどの範囲なのかもエクセルはわかっています。

これはかなり便利なことなんです。追ってそのパワーもわかると思います。

テーブルへの変換方法

では、実際に表をテーブル化してみましょう。

以下のような請求データの一覧表があるとします。

エクセルの請求データリスト

この表の上のいずれかのセルにカーソルが置かれた状態で、リボンから「挿入」→「テーブル」を選択してみてください。

エクセルのリボンからテーブルを選択する

もしくは、ショートカットキー Ctrl + T でもOKです。

すると、「テーブルの作成」ダイアログが開きます。

テーブルの作成ダイアログ

ここで、テーブル化したいセル範囲を指定するのですが、エクセルが自動でデータのある範囲を検出してくれますので、ほとんどの場合はそのまま「OK」で良いはずです。

これでテーブルへの変換は完了です。スタイルが設定されるので、テーブル化されたことはすぐにわかりますね。

エクセルのリボンのテーブルツールメニュー

リボンに「テーブルツール」「デザイン」というメニューが登場しますので、このリボンや右クリック操作で、テーブルならではの機能を堪能することができるようになります。

テーブルはListObjectオブジェクト

では、このテーブルをVBAで取得してみましょうか。

VBAではテーブルはListObjectオブジェクトとして取り扱います。

名前がびみょーって思うかも知れませんね…。Excel2003までは、テーブル機能は「リスト機能」と呼ばれていた名残だそうです。Excel2007から「テーブル」と呼ばれるようになりました。

イミディエイトウィンドウで以下のように入力して Enter してみましょう。

? ActiveSheet.ListObjects(1).Name

すると、以下のようにイミディエイトウィンドウに出力されるはずです。

ListObjectオブジェクトの名前をイミディエイトウィンドウに出力

では、この命令の解説をしていきましょう。

シート上のテーブルをコレクションとして取得する

まず、テーブルつまりListObjectオブジェクトは、Worksheetオブジェクトの配下のオブジェクトです。

そして、Worksheetオブジェクトには、複数のテーブルを配置することができますので、コレクションで取得することになります。

Worksheetオブジェクト上にある、テーブルをコレクションとして取得するにはListObjectsプロパティを使います。

Worksheetオブジェクト.ListObjects

ListObjectsコレクションからListObjectオブジェクトを特定する

コレクションとして取得したので、その中から単体のListObjcetオブジェクトを特定する必要があります。

1から始まる整数が順番に割り振られているインデックスを使うか、テーブル名を使うかのどちらかで、以下のように単体のテーブルオブジェクトを指定します。

ListObjectsコレクション(インデックス)
ListObjectsコレクション(テーブル名)

これで得られるのは、ListObjectオブジェクトです。

シート上にはそんなにたくさんのテーブルを配置することはないと思いますので、だいたいはインデックスで1とか2を指定すればよいのかなと思います。

テーブル名を取得する

テーブル名を取得するには、ListObjectオブジェクトに対してNameプロパティです。

ListObjectオブジェクト.Name

テーブル操作において、テーブル名はあまり重要ではないことが多いですが、確認用としてNameプロパティは便利です。いつも便利です。

なお、シート上では該当のテーブルを選択した状態で、リボンの「テーブルツール」→「デザイン」→「テーブル名」で、テーブル名を確認することができますよ。

エクセルでテーブル名を確認する

まとめ

以上、エクセルのテーブルとはなにか、そのメリット、そしてVBAでテーブルを取得する方法についてお伝えしました。

まだテーブル化の恩恵についてはわからないかも知れませんが、次回以降で徐々にそのパワーを味わっていくことにしましょう。

次回は請求データのテーブルを題材に、ListObjectオブジェクトの構造について見ていきましょう。

どうぞお楽しみに!

エクセルVBAでテーブル名を使用してテーブルを取得する方法

$
0
0
name

photo credit: Go-tea 郭天 Special 11/52 via photopin (license)

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

請求書マクロの作成を題材として、エクセルVBAでテーブルを操作する方法についてお伝えしています。

前回の記事はコチラ。

エクセルVBAでテーブル操作~そのメリットと変換方法&ListObjectの取得
エクセルVBAでテーブルを操作する方法について丁寧に解説していきます。今回は、テーブルとは、エクセルのデータリストをテーブルに変換する方法、VBAでテーブルをオブジェクトとして取得する方法をお伝えします。

そもそもテーブルとは何か、またテーブルを表すListObjectオブジェクトの取得の方法についてお伝えしました。

今回は、題材とする請求データのテーブルを例として、エクセルVBAでテーブル名を使用してテーブルを取得する方法について解説をしていきます。

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

請求データのエクセルファイルの構成

まず、使用するエクセルファイルの構成について紹介していきます。

「請求データ.xlsm」というエクセルファイルに、以下2つのシートが含まれています。

  • 「データ」シート: 請求する品目や価格のデータと取引先リストが含まれるシート
  • 「ひな形」シート: 取引先ごとに作成する請求書のひな形として使用するシート

「データ」シート

「データ」シートはその名の通り、各種データを記載するシートです。

イメージはコチラです。

請求データファイルの「データ」シートのイメージ

「請求データ」と「取引先マスタ」の2つのテーブルが用意されていますね。それぞれのテーブルの役割は以下の通りです。

  • 「請求データ」テーブル: 請求する品目やその価格に関するデータのリスト
  • 「取引先マスタ」テーブル: 取引先リスト。このリストの数だけ請求書を作成する

本来、シートには1種類の表リストを配置したいところですが、テーブル機能を使うことで、そのデメリットはスポイルすることができます。その話は後ほど解説します。

なお、こちらのシートはオブジェクト名を「wsData」と変更しています。

「ひな形」シート

そして「ひな形」シートのイメージはこちら。

請求書データファイルの「ひな形」シートのイメージ

こちらには、取引先ごとの品目をリストするためのテーブルが用意されていますが、まだデータが一つもありません。

なお、こちらのシートはオブジェクト名を「wsTemplate」としています。

請求書作成マクロの動作

請求書作成マクロの動作としては、以下のような流れを想定しています。

  1. 取引先ごとに新規ブックを作成する
  2. 「ひな形」シートをその新規ブックにコピー
  3. コピーした「ひな形」シートのテーブルに、その取引先に請求する請求データを転記していく

請求データファイル上のテーブルをVBAで確認してみる

では、これらのテーブルの様子をVBAの視点で調べてみましょう。

以下のようなプロシージャを用意します。

Sub テーブルリスト()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
    Dim i As Long
    For i = 1 To ws.ListObjects.Count
        Debug.Print ws.Name, i, ws.ListObjects(i).Name
    Next i
Next ws
End Sub

このプロシージャを実行すると、イミディエイトウィンドウに以下のような出力が得られます。

各シートのテーブルリストをイミディエイトウィンドウに出力

各テーブルについて

  1. シート名
  2. インデックス
  3. テーブル名

を出力して確認することができました。

For Each~Next文でシートについてループする

まず、3行目から8行目までのFor Each~Next文ですが、これは現在のマクロブックに存在する全てのシートについてのループ処理となります。

For Each~Next文はコレクションに含まれる要素全てについて繰り返すループ文です。

繰り返すたびに、別の要素を取り出して変数(今回の例ではWorksheet型の変数ws)にセットしてくれます。

つまり、「データ」シートと「ひな形」シートの2つについてのループですね。

For文でシート上のテーブルについてループする

その内側の5~7行目のFor~Next文ですが、繰り返しの最終値は以下のように設定されています。

ws.ListObjects.Count

まず、wsはループで対象となっているシート、それに対するListObjectsコレクションを取得しています。さらに、そのListObjcetsコレクションに対してCountプロパティでその要素数を取得しています。

ListObjectsコレクション.Count

つまり、このループは、それぞれのシートに存在するListObjectオブジェクト(つまりテーブル)の数だけ繰り返すループということになります。

なぜListObjectsコレクションに対してFor Each~Next文を使わなかったか

ListObjectsコレクションはコレクションなので、For Each~Next文を使うことができます。

ですが、今回あえてCountプロパティを使って最終値を求めつつ、For文を使ったのか…?

それは、出力する内容にListObjectオブジェクトのインデックスがほしかったからです。

ListObjectオブジェクトには残念ながらIndexプロパティが存在していませんので、その役割をiに担ってもらってということです。

テーブル名を変更する

さて、実際にマクロでテーブルを取得する際に、インデックスで取得しても良いのですが、テーブル名を変更して使うという手も考えられます。

もともとのテーブル名は「テーブル1」などという識別しづらいネーミングなのですが、これは自由に変更することができます。

テーブル名は、テーブルを選択した状態で、リボンの「テーブルツール」→「デザイン」の「テーブル名」欄で編集をします。

エクセルでテーブル名を編集する

テーブル名でListObjectオブジェクトを取得する

例えば、以下のように変更をしてみましょう。

  • テーブル1: 請求データ
  • テーブル2: 取引先マスタ
  • テーブル3: ひな形データ

すると、以下のように各テーブルを取得することができます。

Sub テーブルの取得()

Debug.Print wsData.ListObjects("請求データ").Name
Debug.Print wsData.ListObjects("取引先マスタ").Name
Debug.Print wsTemplate.ListObjects("ひな形データ").Name

End Sub

インデックスよりテーブル名で指定したほうがコードの可読性は高くなります。一方で、テーブル名であれば他のユーザーがうっかり変更しちゃうというリスクも少ないでしょう。

まとめ

以上、エクセルVBAでテーブル名を使用してテーブルを取得する方法についてお伝えしました。

表を「範囲」ではなくて、「名前」でそして「オブジェクト」として管理できるのは、テーブル機能の大きなメリットです。

次回は、もう少し突っ込んで、ListObjectの構成について考えてみましょう。

どうぞお楽しみに!

連載目次:エクセルVBAでテーブルを活用した請求書マクロを作る

エクセルのとっても便利な機能「テーブル」。VBAで操作するときも、テーブルならではの便利さを味わうことができます。請求書マクロを題材にVBAによるテーブルの操作方法をお伝えしていきます。
  1. エクセルVBAでテーブル操作~そのメリットと変換方法&ListObjectの取得
  2. エクセルVBAでテーブル名を使用してテーブルを取得する方法
Viewing all 2186 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>