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

2019年の今年の漢字と振り返り、よい活動を重ねられた一年でした

$
0
0
stack

photo credit: hireahelper Six Stacks of Washi Tape via photopin (license)

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

今年ももう大晦日になりました。時が経つのは早いものです。

2019年の漢字は「令」でしたね。元号が変わるというのは、なかなかないですもんね。

今年の漢字、2019年は「令」 | リセマム
 日本漢字能力検定協会は2019年12月12日、今年の世相を漢字一字で表現する年末の風物詩「今年の漢字」を発表した。京都・清水寺の森清範貫主が揮毫した漢字一字は「令」。

さて、私自身も毎年「今年の漢字」を決めております。

ということで、今年2019年の漢字について、また一年の振り返りをしていきたいと思います。

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

2019年の今年の漢字

2019年、今年の漢字は「重」にしたいと思います。

あ、「重い」の意味ではなくて、「重ねる」の意味です。

独立してから、またはブログを開始してから4年半、コミュニティはじめて2年、書籍の出版も一冊重ねることができました。

総合的にいろいろと「重」ねてきたな~ということで。

2019年年始の宣言と振り返り

ブログを日々書いているものですから、年始にはいつも「今年はこれやる」と宣言するような記事をいくつか書いているんですね。

それに沿って今年の振り返りを…!

ブログ・書籍について

まず、以下の記事で書くこととコミュニティについて、あれこれ目標を書いておりました。

ペンの力とコミュニティ~「働く」の価値を上げるために2019年にやりたいこと
明けまして、おめでとうございます!2019年も引き続き「日本の『働く』の価値を上げる」をテーマに活動をしていきます。その延長線上で、ブログ、書籍、コミュニティという軸で2019年やりたいことを書いております。

ブログ・書籍については、こんなふうに書いてます。

  • ブログは毎日1本ペースで頑張る
  • 月間100万PVはどこかで達成したい
  • パーフェクトVBA(仮)を出版

記事数は、今年は本記事含めて249本。達成率は約70%くらいですね。まずまずかと。

月間100万PVは2019年7月に見事に達成することができました!

ブログ100万PV達成記念スペシャル!普段は聞けない?執筆メンバーのマル秘トーーク!
2015年2月に開設した当ブログ、おかげさまで100万PVを達成しました!100万PV達成記念企画!執筆メンバーによるマル秘トークをお届けします。隣ITで執筆してみてどんな成長があった?

まあ、数字自体にたいした意味はないですが、大台の数字を公言できるのはメリットありますね。

「パーフェクトExcel VBA」は11/25になんとか出版することができました。長かった…!

書籍「パーフェクトExcel VBA」発売についてのお知らせ
Excel VBAの本格的な解説書「パーフェクトExcel VBA」が技術評論社さまから発売されました!本ページでは、本書のお知らせ、書評などの情報を発信していく特集ページです。

本書に関しては、発売からわずか2週間で重版が決まりました…ありがたし。

そして、「Excel VBAを実務で使い倒す技術」と「詳解!GoogleAppsScript完全入門」も順調に推移して、それぞれ第6刷となりました。

コミュニティ

コミュニティ「ノンプログラマーのためのスキルアップ研究会もスタートして2年となりました。

それについては、年始にこのように申しておりました。

  • イベントで私以外のメンバーに登壇してもらう
  • 全国に出向いて、各地にチームの種をつくりたい
  • コミュニティ内で初心者向け講座を開催する

毎月行っているメインのオフラインイベント「定例会」ですが、ゲストも含めてのべ11名の方がご登壇されました。

定例会だけでなく、ファミプロイベントや「はじめてのノンプロ研」イベントでもご登壇いただいたり、もくもく会のモデレーターもたくさんの方にお手伝いいただいています。

地方イベントは、大阪が3回、仙台が1回、高松が1回と精力的に赴けたかなと思います。

大阪(現在12名のメンバーがいます)以外はチームとしてはまだまだこれからですが、地道にがんばります。

コミュニティ内のプログラミング講座は、初心者向けVBA・GAS・Python、そして中級VBAの4コースで、計7講座開催。のべ108名が受講されました。

しかも、講師やティーチング・アシスタント(TA)もメンバーにお願いして、「教えることは2度学ぶこと」の層が重なり、その輪が広がりつつあります。

これからどんどん広がるのが楽しみであります。

プログラミングについて

プログラミングについてはこんなことを言ってました。

  • VBA
    • ライブラリ活用について発信や貢献したい
  • Google Apps Script
    • GCPの門戸を開きデータベースの課題を解決したい
    • Vue.js+HTML活用でUIの課題を解決したい
  • Python
    • ノンプログラマー向けのアウトプット
2019年プログラミング言語別に考えていること、やりたいこと
明けましておめでとうございます。ノンプログラマー向けのプログラミングという視点で、2019年にプログラミング言語VBA、GAS、Pythonについて考えていること、やりたいことをお伝えします。

VBAに関しては、そこまで手が回りませんでしたね…

ただ、GASのほうですが、データベースの問題とUIの問題は、「App Maker」が解決するのではないかと、研究と発信を重ねました。

はじめてのCloud SQLによるApp Makerアプリ開発、その概要と経緯と道筋
App MakerについてGCPのCloud SQLを使った事例についてのシリーズを開始します!今回は、はじめてのCloud SQLによるApp Makerアプリ開発、その概要と経緯と道筋についてです。

また、GASから直接「Cloud SQL」を操作するシリーズも連載開始しました。

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

App MakerとCloud SQLについては、まだまだノンプログラマー向けに地ならしが必要と思いますので、がんばります。

Pythonについては、ノンプロ研講座でも初心者講座を開催し、また「ノンプログラマーが動かして覚える入門Python仕事術(仮)」(通称「ノンプロPython」)の執筆が開始しました。

Python自体は大注目の言語なのですが、ノンプログラマーにとって、何をどう目指すべきか…かなり混沌としております。

ただ、今年の活動を通して見えてきたところもあるので、来年に書籍として、講座としてアウトプットできればと思います。

ワークスタイルと家庭

ワークスタイルと家庭については、以下のように宣言していました。

  • 家族で出張に行く
  • 食洗機、ロボット掃除機、家事代行サービス
2019年のワークスタイルを良くするために家庭に投資をしよう
今年やりたいこととしては、もう一つ別の切り口がありまして、それはワークスタイルについてです。それで、そのワークスタイルを良くするために、家庭に投資をしようという結論にいたりましたので、お伝えしていきます。

家族での出張は、ノンプロ研イベントや仕事に合わせて、仙台、浜松、大阪、高松へ出向きました。

後者は…たいへん申し訳ございません…来年こそは…!!

あと、家族関連のトピックとしては、コミュニティで「ファミプロ」をスタートしました。

ファミリー向けプログラミング研究会「ファミプロ」のKickOffイベントを開催しました
コミュニティ「ノンプロ研」では、子どもたちも含めた家族向けプログラミング学習活動をしていこうとなりました。今回は、ファミリー向けプログラミング研究会「ファミプロ」のKickOffイベントレポートです。

毎月1回ペースで開催してまして、今は「お父さんと子供がファミプロに参加して、奥さんがひとりの時間を作れる」というニーズを満たしておりますw

まとめ

以上、2019年の振り返りをお送りしました。

全体として、いい活動を重ねられた一年だったかなと思います。

ともにアクティブに活動してくださっているノンプロ研のみなさん、ブログや書籍を応援してくださっているみなさん、そして家庭で支えてくださっている奥さんと息子へ感謝したいと思います。

そして、初心忘るべからず、あぐらをかかず、おっさんでも常にチャレンジ!

引き続き、皆さんの「働く」の価値を上げるべく、活動を重ねてまいりますので、今後ともどうぞよろしくお願いいたします。


2020年の目標お仕事編。ブログ・書籍・コミュニティを中心にやりたいことを宣言します

$
0
0
road

photo credit: Natalia Medd Give me your hand ) via photopin (license)

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

明けましておめでとうございます。

2020年、いよいよ来ましたね!

今年も引き続き「皆さんの『働く』の価値を上げる」をテーマに活動をしていきます。

それで、毎年そのテーマを遂行すべく、年明けに「今年やりたいこと」みたいなテーマで記事を書いています。

ちなみに、昨年は以下3部作。

ペンの力とコミュニティ~「働く」の価値を上げるために2019年にやりたいこと
明けまして、おめでとうございます!2019年も引き続き「日本の『働く』の価値を上げる」をテーマに活動をしていきます。その延長線上で、ブログ、書籍、コミュニティという軸で2019年やりたいことを書いております。
2019年プログラミング言語別に考えていること、やりたいこと
明けましておめでとうございます。ノンプログラマー向けのプログラミングという視点で、2019年にプログラミング言語VBA、GAS、Pythonについて考えていること、やりたいことをお伝えします。
2019年のワークスタイルを良くするために家庭に投資をしよう
今年やりたいこととしては、もう一つ別の切り口がありまして、それはワークスタイルについてです。それで、そのワークスタイルを良くするために、家庭に投資をしようという結論にいたりましたので、お伝えしていきます。

今年も、いくつかの記事にわけて今年やりたいことをお伝えしていきます。

まずは、お仕事編ですね。

ということで、2020年やりたいことお仕事編。ブログ・書籍・コミュニティを中心に宣言するをお伝えします。

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

収益の3つの柱と集客エンジン

さて、弊社ですが以下3つが主な収益の柱になっております。

  • クライアントワーク
  • コミュニティ
  • 書籍

それで、クライアントワークとコミュニティの集客のエンジンになっているのが、ブログですね。

あと、書籍もブログ経由で告知&販売していますし、書籍経由でコミュニティやクライアントワークにつながったりもします。

いい感じで、それぞれが連動していますね。

ブログ

当ブログ「いつも隣にITのお仕事」は、今年の2月で5周年になります。

数字的には、昨年の7月に月間100万PVを達成した以降、基本的には横ばいで、100万弱をつーっと推移している感じです。

PVを伸ばすこと

これまで、ブログの収益化は広告販売を中心にいろいろと試してきた結果、100万PVを突破してもあまり収益にはつながらないです。

しかも、広告はそもそも「『働く』の価値を上げる」につながらない活動なのでやりません。

PVが伸びれば、インバウンドによる集客も増えるかも知れないのですが、仕事を捌けるのが、現在は私とパートナーさんだけなので、無理に増やしても辛い…

なので、今年は(も)淡々と書き続けますw

更新数について

次回の記事でお伝えすると思いますが、スキルとして身につけてその上で皆さんにもシェアしたい領域の記事をしっかり書きつつ、別ブログを立ち上げますので、当ブログの更新数でいうと少し落ちるかなとは思っています。

10日のうち7日くらい更新できれば、上出来ですね。

書籍

書籍は、これまで3冊を執筆してきました。

2017年に出版した「Excel VBAを実務で使い倒す技術」も「詳解! Google Apps Script完全入門」も、順調に推移してお小遣い的に稼いでくれてます。

加えて、直近出版した「パーフェクトExcel VBA」は初速好調で、2020年の収益はそこそこ期待しちゃっています。

積み重ねると、書籍もなかなか頼りになりますね!

2020年の出版予定

さらに今年は、初のPython本も執筆していますし、監修で携わっている本も出ると思いますので、新たに2冊ほど世に投じられるかなと思っています。

2020年の後半は執筆のスケジュールは空いているので、イメージとしてはGAS系の何かがいいかな~と思っていますが、まあそれはまた追々固めていきたいと思います。

コミュニティ

2017年からはじまったコミュニティ「ノンプログラマーのためのスキルアップ研究会」は、発足当時からかなり順調にメンバー数が増えてまして、現在93名となりました。

2015年に独立してから、受託で食いつないでた身としては、固定収入は本当にありがたい…泣

それで、懐的にはここをじゃんじゃん伸ばしたいところなのですが、実は昨年の7月に100人を突破してから、ずっとメンバー数はキープの状態となっています。

オフラインイベント

まず、定例会の内容を充実させていきます。

昨年は、講座の卒業LT大会を定例会に開催していましたが、今年からは別イベントとして開催することになりますので、定例会用のテーマをきっちり毎月準備していきます。

皆さんの登壇の機会も増えそうですね。

あとは、分科会としては、はじめてのノンプロ研に加えて、英語イベントなども企画してます。

もくもく会も、年始からもう1ライン増えそうですね…忙しくなりそうです。

地方展開

そうなんです。地方展開は、頑張りたいところです。

これまでの活動で、運とタイミングの要素がすごく大きいことはわかっているので、チャンスとあれば、頑張ってリソースかけてトライしていきたいというところです。

早速、2月には福岡でイベントを開催すべく準備中です。

あと、北の大地も…あるのかな?どうかな?

それとは少し違うアプローチで、Zoomオンラインイベントも試して、オンラインのつながりも強化していきたいと思います。

講座

講座は2019年の躍進の一番の立役者といっても良いかと思います。

TAさん、そして講師と「教える側」の機会を圧倒的に増やせました。

初心者講座は4講座、中級講座は2講座は最低でも開催したいです。

あとは、新しい講座を何かトライしてみたいところ。

GAS中級は決まっていて、Python中級とかですかね。

ブログとかもいいかもですね。あと、英語は…私が参加したいw

ニーズがあれば複数ラインにしていく…という流れも当然検討したいのですが、いずれも需要次第ですね。

お金があればやりたいこと

あと、ずっと保留気味ですが、お金があればやりたいことがいくつかあります。

こんなやつです。

  1. プランノーツのメンバー確保
  2. 有料職業紹介事業計画
  3. ノンプロ研コワーキング&イベントスペース計画

いずれもお金がある、または収益性が見込める計画が組めるのが前提でないと進められないので、ずっと夢的なポジショニングではありました。

ただ、コミュニティと書籍のおかげで、月々の収益が少しずつ安定&ベースアップしてきたので、そこが順調にいけば少し冒険できる時期がくるかも知れません。

まあ、2020年ではないかも知れませんし、タイミングが良ければ2020年に動けるかも知れませんし。わかりませんね。

まとめ

以上、2020年やりたいことお仕事編。ブログ・書籍・コミュニティを中心に宣言しました。

なんか、「今年の目標」というとビッグなことを仕掛けたくなりますが…そういうの、あまりなくてすみませんという感じです。

ただ、日々の淡々としたことでも、積み重ねるとビッグな成果になってたりすることがありますね。

そしてチャンスがあれば、エイっ!と乗っかればいいかなと。

さて、次回はスキルアップ編をお送りしますね。

どうぞお楽しみに!

2020年やりたいこと、個人のスキルアップ編~プログラミング&英語~

$
0
0

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

昨日、1月1日は「2020年やりたいこと仕事編」をお送りしました。

2020年の目標お仕事編。ブログ・書籍・コミュニティを中心にやりたいことを宣言します
明けましておめでとうございます。引き続き「皆さんの『働く』の価値を上げる」をテーマに活動をしていきます。今回は、2020年やりたいことお仕事編。ブログ・書籍・コミュニティを中心に宣言してまいります。

ただ、そのような活動の「仕入れ」は学びであり、スキルアップなわけです。

ということで、本日1月2日は、2020年やりたいこと、個人のスキルアップ編についてお伝えしていきますよ。

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

英語を学びはじめました!

コミュニティ「ノンプロ研」の皆さんや、Twitterのフォロワーの皆さんは、もうお気づきと思うのですが、昨年末から英語の学習をはじめました。

そして、学習記録用に別ブログもはじめちゃいました。

IT屋さんの英語学習帳
自分と皆さんの「働く」の価値を上げるべく...

現時点で私43歳、しかも英語はド初心者です。

本来、IT屋としては、そんな暇あったらもっとITに関する技術力を高めるべきという意見もあり、私の中にもそういう私がいるのは確かです。

ただ、「自分しか提供できない価値」と考えたとき、私の場合は「IT」に「書くこと」「話すこと」といった基礎スキルを掛け算したところに強みがあると感じているんですね。

学習対象として「英語」を思いついたとき、それこそビビビっときたんです。

そりゃ、習得するには長い年月が必要なのは重々承知で、以下に書いている通り2020年には収まらない目標ではございます。

英語の習得には何時間が必要なのか?そして、それは実現可能なのか?
英語のド初心者のアラフォーのおじさんが、英語を勉強し始めました。しかし、とても大変そう。ということで、この記事では「英語の習得には何時間が必要なのか?そして、それは実現可能なのか?」をお伝えしていきます。

なのですが、それが達成した暁には、英語がこれまで学んできたこと、これから学ぶことを、ものすごくブーストするのではないか、と。

以下の記事にもいろいろと綴っているのでご覧いただければ幸いです。

なぜアラフォーのおじさんが英語の学習をはじめたのか
この記事は当ブログ「IT屋さんの英語学習帳」の最初の記事になります。ITの仕事をしているアラフォーのおじさんが、なぜ英語の学習をはじめたのか、なぜ当ブログを開設したのかについてお伝えします。

Microsoft関連

さて、続いてプログラミング・開発関連です。

まずはMicrosoft関連、主にVBAとPower Platformですね。

VBAは少し落ち着こう

VBAは、昨年11/25に「パーフェクトExcel VBA」を出版しました。

2年くらいがっぷり四つで向き合ってきましたので、ちょいとお腹いっぱい感があり…少し落ち着こうかと思っています。

気になるPower Platform

一方で、Microsoftさん。Power Platformにものすごく力を入れている様子で、魅力的なサービスやアップデートを次から次へと投下されています。

特に、ノンプログラマー向けとして気になっているのは、ノンコードアプリ開発環境の「Power Apps」と

Excelとパワポの知識だけで業務アプリを開発できる「PowerApps」とは
PowerAppsは、Excelのような関数とPowerPointのような操作だけで、コーディングすることなくアプリケーションが開発できてしまうサービスです。

ワークフロー自動化ツールにRPA機能を追加した「Power Automate」です。

マイクロソフトの「Flow」が「Power Automate」に、RPA機能追加--「Power Platform」強化
マイクロソフトはローコード/ノーコードプラットフォーム「Power Platform」ファミリーに新機能を追加し続けている。「Microsoft Ignite 2019」カンファレンスで、「Microsoft Flow」をリブランドした「Power Automate」やRPA機能などについて発表した。

いずれも、狭義にはプログラミングとは言えないかも知れませんが、場合によっては一気にゲームチェンジが起きるかも知れないと思っているので、注意深くいないといけないと思っています。

1月には、ノンプロ研の定例会と、外部イベントでいくつか話をうかがう機会がありますので、頑張ってキャッチアップしていきたいと思います。

Google関連

続いて、Google関連、主にGoogle Apps Script(GAS)とApp Makerですね。

ECMAScriptの対応は未だ訪れず

GASですが、一番気になるのは、2018年「Google Cloud Next」で発表された最新のJavaScriptへの対応(ECMAScript 2017に対応すると発表されていました)です。

Notes on the future of Google Apps Script from Google Cloud Next ‘18 #GoogleNext18
At Google Cloud Next ‘18 it was great to see and hear about a number of G Suite and Google Apps Script updates. This post highlights a number of launched and fu...

2019年内には対応されるかな…と踏んでいたのですが、まだでした。残念。

対応され次第では、個人的にはけっこう忙しくなるかなと思っているのですが、なかなか情報は得られないので、気長に待つですね。

Cloud SQLとの連携

後述のApp Makerとの関連もあり、Cloud SQLを使用した事例についても、ブログなどで提供をはじめました。

Googleの良いところは、GAS→App Maker→GCPみたいなスキルアップの道筋が明確なところで、そのさなかにCloud SQLに触れることになります。

それが、ノンプログラマーにとってはデータベースについて学ぶかなり良い機会になるのではないかと期待しています。

近いポジションでデータ分析系の「BigQuery」がありますので、そちらも気になってます。

App Makerの研究

まだまだ日本にはApp Makerの事例は少ないですが、研究を重ねてブログでも紹介していきたいと思います。

MicrosoftさんのPowerApps(まだ触っていないので少し違うかも知れませんが)や、kintoneなど、ローコードアプリ開発環境が出揃うので、非常に興味深い分野と思っています。

できれば、今年のうちにApp Makerを使った開発実績か、研修実績かを上げたいですね。

Pythonはノンプログラマー向け書籍執筆中

そして、Pythonですね。

Pythonは、かなり人気の言語になってきていて、ノンプログラマー向けの書籍もいくつか書店に出回るようになりました(そして、かなり売れている様子です)。

ただ、個人的にはノンプログラマー向けのベストプラクティスが、かなりあやふやなままブーム化している気がしていて、若干の危機感を持っています。

今執筆中の「ノンプログラマーのためのPython仕事術(仮)」(通称ノンプロPython)で、そこにひとつのモデルを提起できれば嬉しいなと思って書いております。

今のところ、5月脱稿の7月発売のイメージで動いています。

まとめ

以上、2020年やりたいこと、個人のスキルアップ編~プログラミング&英語~についてお伝えしました。

英語も、プログラミングも、ノンプログラマーの皆さんにお役に立てる情報やコンテンツをお届けできるよう、インプットも欠かさずにいきます。

今年も、どうぞご活用くださいませ!

2020年、ITひとり社長の経営的なこと、やりたいことを考える

$
0
0
Offroad

photo credit: Infomastern Offroad via photopin (license)

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

さて、新年ということで、今年のやりたいことをツラツラと書いております。

1日は仕事編。

2020年の目標お仕事編。ブログ・書籍・コミュニティを中心にやりたいことを宣言します
明けましておめでとうございます。引き続き「皆さんの『働く』の価値を上げる」をテーマに活動をしていきます。今回は、2020年やりたいことお仕事編。ブログ・書籍・コミュニティを中心に宣言してまいります。

2日はスキルアップ編をお送りしました。

2020年やりたいこと、個人のスキルアップ編~プログラミング&英語~
昨日、1月1日は「2020年やりたいこと仕事編」をお送りしました。本日は、そのためのインプットとして2020年やりたいこと、個人のスキルアップ編~プログラミング&英語~についてお伝えしていきます。

さて、昨年の3日目は家庭&ワークスタイル編をお送りしていたわけですが…

2019年のワークスタイルを良くするために家庭に投資をしよう
今年やりたいこととしては、もう一つ別の切り口がありまして、それはワークスタイルについてです。それで、そのワークスタイルを良くするために、家庭に投資をしようという結論にいたりましたので、お伝えしていきます。

あとはお金次第みたいな課題しか残っていなくて、それはそれで「稼ぎましょう!」というだけの話になっちゃいますため、ちょっと視点を変えて、経営編にしてみようかと。

ちょっと頭の中を整理したいというのもあり、2020年、ITひとり社長の経営的なこと、やりたいことを考えるの巻です。

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

株式会社プランノーツって儲かっているの?

2015年6月に会社を設立しまして、そこから4年半、ずっとひとり社長でやってきています。

ブログは月間100万PV突破、コミュニティは2年で100名近くのメンバー数に、書籍はすべてあわせて14刷と、数字だけ見るとさぞ儲かっているだろうと思われるかも知れませんが、全然そんなことはありません。

売上上昇率でいうと、こんな感じ。

  • 2期目: 81%Up
  • 3期目: 53%Up
  • 4期目: 2%Down

まあ1期目が、ひどすぎましたからね…そして、3期目と4期目は横ばい。

ということで、家族3人、ごく普通の生活はできていますが、そんなに儲かっていません。

具体的に言うと、「じゃあ従業員を増やそうか」というレベルには至っていません。

売上の軸をコミュニティ&印税シフトへ

ブログのPVが伸びれば受託の件数増えるっしょ、と思われるかも知れませんが、そんなことはありません。

月間50万PVでも、月間100万PVでも、弊社のお仕事の種類でいうと受注に至るお問い合わせは月に1,2件なので、誤差みたいなもんです。読めません。

売上は伸びていないのですが、その内訳は改善しているように見えることがあります。

以下、コミュニティと印税の売上の比率を見てください。

  • 2期目: 0%
  • 3期目: 19%
  • 4期目: 32%

つまり、定常的な売上の比率が増えてきています。

未来の売上がある程度でも読めるというのはありがたいものです。

書籍の話とかはたまたま来たわけで、コミュニティも「継続支援がしたい」というのが、結果的に月額制になっているということはあるので、あまり狙っていたわけではないのですが、打ち手としては悪くなかったかなと思います。

2020年も牛歩戦法でコミュニティ+印税シフト

ということで、2020年もこのままコミュニティ+印税シフトを推進していきます。

牛歩ですけどね。でも、牛歩戦法、わりと得意です。

書籍について

書籍に関しては、ひたすら毎日3時間のリソースを投下していくだけなので、作戦としては工夫も何もありません。

2020年は、パーフェクトExcel VBAの印税が発生しますし、Python本「ノンプロPython」と、監修本も出ますので、多少は書籍印税の対売上比率を持ち上げられるかなと思います。

コミュニティ

コミュニティは正直、今が頭打ちという可能性もゼロではありません。

2019年は講座きっかけで入会された方が多かったのですが、少し鈍化している雰囲気もあります。

講座もラインナップを増やし、定例会のテーマを充実させ、英語やブログなどのコンテンツも出てきそうというところで、あれこれ色々と試しながら進めていければと思います。

Chatworkアシスタントからお仕事チームへ

売上ではなくて、コストに関する話なのですが、昨年は事務作業の一部を「Chatworkアシスタント」にお願いしていました。

ひとり社長が1ヶ月間でChatWork アシスタントにお願いしたお仕事一覧とポイント
オンラインアシスタントサービス「ChatWork アシスタント」を利用してみています。今回、最初の一ヶ月でChatWork アシスタントに依頼した仕事一覧とやってみてわかった依頼のポイントについてお伝えします。

ただ、Facebookアカウントを複数人で使っていたので凍結されるという事態が発生し、コミュニティ関連の依頼がごそっとお願いできなくなりました。

そうすると、月30時間の仕事を集めるのが辛くなり、契約はいったん終了としました。

代わりに、コミュニティ内のことは、コミュニティ内の有志の皆さんにお願いする仕組みとして「お仕事チーム」を作りました。

これで、毎月の出費に関してはだいぶ改善されましたし、細かく指示しなくて済む、何より新たな視点やアイデアももらえるので…正直、超助かる。

今年は、コミュニティについてマーケティング的なことや、デザイン的なことも、お仕事チームでお願いしていくというのはありかと思っています。

人と協働するということ

本来、経営者としては、弊社のテーマに強く共感してくださっていて頑張りたい人、成長意欲がある人を雇用して、お互いコミットした上で十二分に働いてもらう…みたいな能力を持っているべきなのだと思います。

そういう意味で、私がそれをできていないので、経営の才能ないのかな、どうなのかな…と思ったりすることもあります。

一方で、これまで隣ITで執筆とパートナーを担当してくださっているノグチさんや、もり さん、前述のノンプロ研の「お仕事チーム」の皆さんや講師・TAの皆さんには、色々とお願いできていて、活動を継続できているわけで。

こういうのもニュースタイルの協働としてありなのかな…とも思ったりしています。

皆さんはどう思いますか?

まとめ

以上、2020年、ITひとり社長の経営的なこと、やりたいことを考えるの巻でした。

お金があればなぁ、人がいればなぁと思うことは、けっこうあります。

ただ、色々と考えた結果、やっぱりコツコツやるしかないわけですね。

こうして、年始に整理ができる機会があって、感謝。

今年も、牛歩戦法でがんばります。

GASのJBDCサービスでCloud SQLのデータベースにレコードを追加する方法

$
0
0
record

photo credit: Marc Wathieu Dust Dealers, Bruxelles via photopin (license)

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

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

前回の記事はこちら。

GASのJDBCサービスでCloud SQLにクエリを実行した結果を取り出す方法
GASからJDBCサービスを使ってCloud SQLのデータベースにアクセスする方法をシリーズでお伝えしています。今回はGASのJDBCサービスでCloud SQLにクエリを実行した結果を取り出す方法です。

GASでCloud SQLにクエリを実行した結果を取り出す方法をお伝えしました。

さて、データベースの値を取り出すだけでなく、レコードの追加や更新、削除などもしていきたいですよね…

ということで、今回はGASのJBDCサービスで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'); 
  
  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();
}

既にCloud SQLに存在している「guestbook」というデータベースの、「entries」というテーブルからすべてのレコードを取り出して、カラム「guestName」「content」の値を表示するというものです。

Cloud SQLのCloud Shellで2つほどレコードを追加していましたので、実行すると以下のように表示されました。

GASのJDBCサービスでクエリを実行した結果を出力

このデータベースについて、他の操作を実行していきましょう。

GASからCloud SQLのデータベースにレコードを追加する

今回は、Cloud SQLのデータベースへ新たなレコードを追加していきたいと思います。

レコードを追加するには、SQLのINSERT文を使うんでしたね。

INSERT INTO テーブル名 (カラム名1, カラム名2, …) VALUES (値1, 値2, …);
GCPのCloud SQLデータベースのテーブルにSQLでレコードを追加する方法
GASからJDBCサービスを使ってCloud SQLのデータベースにアクセスする方法をシリーズでお伝えしています。今回は、GCPのCloud SQLデータベースのテーブルにSQLでレコードを追加する方法です。

このSQLステートメントを実行する命令を、GASのJBDCサービスから探していけばよいわけですね。

更新系のSQLステートメントを実行する

今回実行しようとしている、INSERT文や、レコードを更新するUPDATE文、レコードを削除するDELETE文など、更新系のSQLを実行する命令として、executeUpdateメソッドがあります。

JdbcPreparedStatementオブジェクト.executeUpdate()

executeUpdateメソッドの対象は、JdbcPreparedStatementオブジェクトで、そこに既にセットされているSQLステートメントを実行するというものです。

ちなみに、整数の戻り値として、SQLの実行により更新された行数を返します。

JdbcPreparedStatementオブジェクトが変数statementに割り当てられているとすると、以下のように使用することができます。

var count = statement.executeUpdate();
Logger.log(count);

さて、SELECT文を実行するときには、JdbcStatementオブジェクトを使いました。

実は、INSERT文もJdbcStatementオブジェクトで実行できるのですが、実際は何が違うんでしょうか?

JdbcPreparedStatementオブジェクトとは

JdbcPreparedStatementオブジェクトとは、SQLステートメントを前もって準備しておくためのオブジェクトです。

具体的には以下のような表記をします。

INSERT INTO entries (guestName, content) values (?, ?)

命令の中に「?」記号が2つ含まれています。

この「?」記号は、プレースホルダーとして使用することができ、後から適宜プレースホルダーに値を入れ込んで使用することができます。

JdbcStatementオブジェクトとの違いは、このプレースホルダーがあるかどうかです。

複数のレコードについて更新系のSQL文を実行したいときには、プレースホルダーを使って効率的に実行できるので、JdbcPreparedStatementオブジェクトを使うと便利なのです。

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

JdbcPreparedStatementオブジェクトを生成するには、以下のprepareStatementメソッドを使います。

JbdcConnectionオブジェクト.prepareStatement(SQL)

引数SQLには、ひとつ以上の「?」記号を含むパラメータ化されたSQLステートメントを指定します。

前述のINSERT文を使うのであれば、以下のようなコードになりますね。

var statement = connection.prepareStatement('INSERT INTO entries (guestName, content) values (?, ?)');
// 何らかの処理
var count = statement.executeUpdate();
Logger.log(count);

プレースホルダーに値を設定する

続いて、SQL文を実行する前に、プレースホルダーに値を設定する必要がありますね。

JdbcPreparedStatementオブジェクトのプレースホルダーに文字列を設定するには、setStringメソッドを使います。

JdbcPreparedStatementオブジェクト.setString(パラメータインデックス, 文字列)

データ型によって、setIntメソッドや、setDateメソッドなど、異なるメソッドを使う必要がありますので、必要に応じて以下で調べてみてください。

Class JdbcPreparedStatement  |  Apps Script  |  Google Developers

レコードをひとつ追加するとして、各カラムに対して以下のような文字列を格納するとしましょう。

  • guestName: Third guest
  • content: I just got here too!

すると、スクリプトは以下のようになります。

var statement = connection.prepareStatement('INSERT INTO entries (guestName, content) values (?, ?)');
statement.setString(1, 'Third Guest');
statement.setString(2, 'I just got here too!');
var count = statement.executeUpdate();
Logger.log(count);

JdbcPreparedStatementオブジェクトを閉じる

JdbcStatementオブジェクトと同様、JdbcPreparedStatementオブジェクトも、使用後はcloseメソッドで明示的に閉じておきます。

JdbcPreparedStatementオブジェクト.close()

レコードの追加を実行を確認する

では、実際にコードを実行して、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 writeOneRecord() {
  var connection = Jdbc.getCloudSqlConnection(url, userName, password);

  var statement = connection.prepareStatement('INSERT INTO entries (guestName, content) values (?, ?)');
  statement.setString(1, 'Third Guest');
  statement.setString(2, 'I just got here too!');
  var count = statement.executeUpdate();
  Logger.log(count);
  
  statement.close();
  connection.close();
}

まず、writeOneRecord関数を実行してログを確認します。

GASからCloud SQLに更新系SQLを実行した行数

実行の結果はここでは確認できませんが、SQLの実行結果として1行の更新を行ったということは確認できます。

続いて、前回作成したreadFromTable関数を実行して、テーブルの中身を確認してみましょう。

GASからCloud SQLのデータベースにレコードを追加した結果

INSERT文による3つ目のデータが追加されていることが確認できますね。

まとめ

以上、GASのJBDCサービスでCloud SQLのデータベースにレコードを追加する方法をお伝えしました。

おそらく、大きく分けてSELECT文によるクエリを実行する方法と、今回紹介した更新系SQL文を実行する方法の2パターンを使うことで、ほぼ対応できるかなと思っています。

なので、いくつか覚えることがありますが、頑張って使いこなしていきましょう!

次回は、他の更新系の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にクエリを実行した結果を取り出す方法

GASのJDBCサービスを使ってCloud SQLのデータベースのレコードを更新・削除をする方法

$
0
0
update

photo credit: kookykrys 20170129_170852 via photopin (license)

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

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

前回の記事はこちら。

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

GASからCloud SQLのデータベースにレコード追加の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'); 
  
  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();
}

function writeOneRecord() {
  var connection = Jdbc.getCloudSqlConnection(url, userName, password);

  var statement = connection.prepareStatement('INSERT INTO entries (guestName, content) values (?, ?)');
  statement.setString(1, 'Third Guest');
  statement.setString(2, 'I just got here too!');
  var count = statement.executeUpdate();
  Logger.log(count);
  
  statement.close();
  connection.close();
}

関数readFromTableと、関数writeOneRecordの2つの関数がありますが、いずれもCloud SQLの「guestbook」というデータベースの、テーブル「entries」を操作するものです。

関数readFromTableはテーブルの各カラムのデータをSELECT文で取得してログ出力するもの、関数writeOneRecordはテーブルにベタ書きのレコードを1行追加するというものです。

CRUDとは

「CRUD」という言葉があります。

これは、データベースアプリケーションが持つべき4つの基本機能のイニシャルを並べた用語で、その4つとは以下のとおりです。

用語 操作 SQL
Create 生成 INSERT
Read 読み取り SELECT
Update 更新 UPDATE
Delete 削除 DELETE

SQLでいうと、INSERT文とSELECT文はこれまでに紹介してきました。

あと、残るUPDATE文によるレコードの更新と、DELETE文によるレコードの削除ができれば、基本機能は押さえることができるということになります。

UPDATE文でレコードを更新する

レコードの値を変更するには、SQLのUPDATE文を使います。

UPDATE テーブル名 SET カラム名1=値1, カラム名2=値2, … WHERE 条件

WHEREとその後の「条件」の部分を「WHERE句」といい、それにマッチしたレコードを更新の対象とします。WHERE句を省略した場合は、すべてのレコードが対象になります。

そして対象のレコードに対して、SET以降に指定した「カラム名=値」に従って、値を上書きします。この部分を「SET句」といいます。

レコードを更新するスクリプト

GASでCloud SQLのデータベースに対してSQLのUPDATE文を実行するスクリプトを作りました。

function updateOneRecord() {
  var connection = Jdbc.getCloudSqlConnection(url, userName, password);

  var statement = connection.prepareStatement('UPDATE  entries SET guestName=?, content=? WHERE entryID=?');
  statement.setString(1, 'third guest');
  statement.setString(2, 'I just got here too!!!!!');
  statement.setInt(3, 3);

  var row = statement.executeUpdate();
  Logger.log(row);
  
  statement.close();
  connection.close();
}

WHERE句の条件には、プライマリーキーとしていたカラム「entryID」を設定すると、一意に決まりますね。

JdbcPreparedStatementオブジェクトの3つのプレースホルダーに設定する場合は、INT型でしたからsetIntメソッドを使用しています。

レコード更新の実行確認

では、レコード更新の実行確認をしていきます。

上記、updateOneRecord関数を実行してから、readFromTable関数を実行して、テーブル内を確認しました。

以下のようにログが出力されます。

GASでCloud SQLのデータベースにUPDATE文を実行した

条件に指定したentryIDが3のレコードの値が更新されていることを確認できます。

DELETE文でレコードを削除する

続いて、レコードの削除について見ていきましょう。

レコードを削除するには、SQLのDELETE文を使います。

DELETE FROM テーブル名 WHERE 条件

WHERE句の条件にマッチしたレコードを削除します。WHERE句を省略した場合は、すべてのレコードが対象になります。

レコードを削除するスクリプト

GASでCloud SQLのデータベースに対してSQLのDELETE文を実行するスクリプトを作りました。

function deleteOneRecord() {
  var connection = Jdbc.getCloudSqlConnection(url, userName, password);

  var statement = connection.prepareStatement('DELETE FROM entries WHERE entryID=?');
  statement.setInt(1, 2);
  
  var row = statement.executeUpdate();
  Logger.log(row);
  
  statement.close();
  connection.close();
}

JdbcPreparedStatementオブジェクトのプレースホルダーには1つだけなので、setIntメソッドをひとつ実行すれば、SQLが完成します。

レコード削除の実行確認

では、レコード更新の実行確認をしていきます。

上記のdeleteOneRecord関数を実行してから、readFromTable関数を実行して、テーブル内を確認してみましょう。

GASでCloud SQLのデータベースにDELETE文を実行した

setIntメソッドで指定した、entryIDが2のレコードが削除されていることが確認できますね。

まとめ

以上、GASのJDBCサービスを使ってCloud SQLのデータベースのレコードを更新・削除をする方法をお伝えしました。

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でテーブルを作成する方法
  6. GCPのCloud SQLデータベースのテーブルにSQLでレコードを追加する方法
  7. GASのJDBCサービスでCloud SQLデータベースに接続をする方法
  8. GASのJDBCサービスでCloud SQLデータベースにクエリを実行する方法
  9. GASのJDBCサービスでCloud SQLにクエリを実行した結果を取り出す方法
  10. GASのJBDCサービスでCloud SQLのデータベースにレコードを追加する方法

【エクセルVBA】AddItemメソッドでリストボックスに値を追加してみよう!

$
0
0

リストボックス,additem皆様こんにちは、ノグチです。

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

前回記事では、リストボックスのRowSourceプロパティにワークシートの範囲を指定することで、リストボックスにワークシートの範囲にある値を表示する方法をご紹介しました。

【エクセルVBA】リストボックスのRowSourceプロパティの値を変動させてみよう!
エクセルのユーザーフォームを作って使うことを目標に、連載記事でコントロールのメソッドやプロパティ、イベントをご紹介しています。今回は、リストボックスのRowSourceプロパティをVBAで指定することで、他のコントロールの入力値によってリストボックスに表示する値を変動させる方法をご紹介しています。

しかし前回記事では、「結局、リストボックスにはワークシート上の範囲にある値しか表示できないの?」というモヤモヤが残ってしまいました。

今回はそのモヤモヤを解消すべく、リストボックスのAddItemメソッドを使って、ワークシートの範囲ではない任意の値をリストボックスの値としてセットする方法をご紹介します。

前回までのおさらい

毎度おなじみ、前回までに作成したユーザーフォームがこちら。

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

前回は、「品名」のテキストボックスに入力した値からこちらのワークシートを検索して…

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

検索にヒットした値をワークシート上に書き出し、書き出した値を「生産地」リストボックスのRowSourceプロパティにセットして、リストボックスに検索結果を表示させたのでした。

そして、前回作成した検索用のコードがこちら。

Private Sub TextItem_AfterUpdate()
With ActiveSheet
    .Range("E:E").Clear
    Dim myRange As Range
    Dim rngSearch As Range
    Dim strAddress As String

    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
        strAddress = rngSearch.Address
        Do
            Set rngSearch = myRange.FindNext(rngSearch)
            If rngSearch Is Nothing Then
                Exit Do
            Else
                If strAddress <> rngSearch.Address Then
                   i = i + 1
                   .Cells(i, 5).Value = .Cells(rngSearch.Row, rngSearch.Column + 1).Value
                End If
             End If
        Loop While rngSearch.Address <> strAddress
    Else
        .Cells(i, 5).Value = "該当なし"
    End If
    'リストボックスに検索結果の範囲をセット
    ListRegion.RowSource = .Range(.Cells(1, 5), .Cells(i, 5)).Address
    End With
End Sub

今回は、こちらのコードを、リストボックスのAddItemメソッドを使った処理に置き換えていきましょう。

AddItemメソッドの記述方法

まずはAddItemメソッドの記述方法から。

リストボックスにRowSourceプロパティを使わないで値を追加する場合、AddItemメソッドを使って下記のように記述します。

ListBoxオブジェクト.AddItem 追加したい値(文字列型), 追加したい順序(数値型)

追加したい順序は、AddItemメソッドで追加しようとしている値をリストの何番目に入れたいのか、を指定するパラメータです。

省略可能で、指定しなければリストの一番下に入れてくれます。

指定したい場合は数値を指定すればよいのですが、先頭が1ではなく0ですので、注意が必要です。

3行以上あるリストの3番目に追加したい場合は、0から3つ数えて「2」を指定することになりますね。

AddItemメソッドでリストボックスに値をセットする

AddItemメソッドで検索結果をリストボックスに追加するコード

では早速、AddItemメソッドを使ってリストボックスに値を追加してみましょう。

コードはこちら。

Private Sub TextItem_AfterUpdate()
With ActiveSheet

   Dim myRange As Range
   Dim rngSearch As Range

   Set myRange = .Range("A2:A13")
   Set rngSearch = myRange.Find(What:=TextItem.Value, LookAt:=xlPart)

   If Not rngSearch Is Nothing Then
        ListRegion.AddItem .Cells(rngSearch.Row, rngSearch.Column + 1).Value
        strAddress = rngSearch.Address
        Do
            Set rngSearch = myRange.FindNext(rngSearch)
            If rngSearch Is Nothing Then
                Exit Do
            Else
                If strAddress <> rngSearch.Address Then
                    ListRegion.AddItem .Cells(rngSearch.Row, rngSearch.Column + 1).Value
                End If
            End If
        Loop While rngSearch.Address <> strAddress
    End If

End With
End Sub

前回のRowSouceプロパティを使う方法の、検索にヒットした値の処理部分を、AddItemメソッドでリストボックスに追加するように変更しています。

検索にヒットした値をAddItemメソッドでリストボックスに追加する

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

検索に使うワークシートは前回同様のこちら。

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

テキストボックスに「いちご」と入力して、ワークシートから検索してみます。

ワークシート上に「いちご」があるのはこちらの2行のみ。

ユーザーフォーム,リストボックス,AddItem,検索結果

なのでリストボックスには「福岡」と「栃木」が表示されるはずです。

テキストボックスにいちごを入力してみると…

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

この通り、表示されてほしい値だけがAddItemメソッドでリストボックスに追加されていますね。

ユーザーフォーム,リストボックス,AddItem,検索結果,フォーム

RowSourceプロパティとの併用はできない

ここまでAddItemメソッドをご紹介してきましたが、注意点がひとつ。

それは、1つのリストボックスに対して、RowSourceプロパティとAddItemメソッドは併用することができないということです。

RowSourceプロパティでリストボックスの値をセットしていた場合、そのリストボックスに対して更にAddItemメソッドで値を追加しようとすると、こんなエラーになってしまいます。

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

また、AddItemメソッドでリストボックスに値を追加していっても、その後でRowSourceプロパティでリストボックスの値を設定してしまうと、AddItemメソッドで追加した値が、RowSourceプロパティに設定したワークシート範囲の値で上書きされてしまいます。

RowSourceプロパティでセットした値の後に続けてAddItemメソッドで値を追加…や、その逆のような都合のよい使い方はできないということですね。

1つのリストボックスに対して何度も値を変更させたい場合は、値を追加する方法はAddItemメソッドでの追加か、RowSourceプロパティを使うかのどちらかに統一しましょう。

最後に

リストボックスのAddItemメソッドを使って、任意の値をリストボックスの値としてセットする方法をご紹介しました。

今回ご紹介したAddItemメソッドと、前回ご紹介したRowSourceプロパティ、ユーザーフォームでやりたいことによって使い分けられるとよいですね。

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

連載目次:【エクセル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のデータベースに複数のSQLを一括で実行する方法

$
0
0

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

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

前回の記事はこちら。

GASのJDBCサービスを使ってCloud SQLのデータベースのレコードを更新・削除をする方法
GASからJDBCサービスを使ってCloud SQLのデータベースにアクセスする方法をシリーズでお伝えしています。今回はGASのJDBCサービスを使ってCloud SQLのデータベースのレコードを更新・削除をする方法です。

GASからCloud SQLへレコード更新または削除のSQLを実行する方法をお伝えしました。

さて、これまでのレコード追加、更新そして削除は一行ずつ実行していましたが、当然複数のレコードを操作したいこともありますよね。

そのような時に使用するのが「バッチ処理」です。

今回は、GASのJDBCサービスでCloud SQLのデータベースに複数の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'); 
  
  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();
}

function writeOneRecord() {
  var connection = Jdbc.getCloudSqlConnection(url, userName, password);

  var statement = connection.prepareStatement('INSERT INTO entries (guestName, content) values (?, ?)');
  statement.setString(1, 'Third Guest');
  statement.setString(2, 'I just got here too!');
  var count = statement.executeUpdate();
  Logger.log(count);
  
  statement.close();
  connection.close();
}

関数readFromTableは、Cloud SQLのデータベース「guestbook」の、「entries」というテーブルの内容をログ出力するものです。

また、関数writeOneRecordは、その「entries」というテーブルに一行追加するという処理です。

それで、このデータ追加ですが、一行ではなくて複数のレコードを追加したいとき、どうすれば良いでしょうか?

今回は、まとめてたくさんのSQLを実行する際の作り方について紹介します。

SQL文を一括で実行する

さて、レコードの追加は更新系のSQLの実行です。

更新系のSQLステートメントを実行する際には、prepareStatementメソッドにプレースホルダー付きのSQL文を渡して、JdbcPreparedStatementオブジェクトを生成するのでした。

JdbcPreparedStatementオブジェクトには、ひとつのSQL文に対して、プレースホルダーの値のセットを複数持たせて置いて、一括で実行できるしくみがあります。

いわゆる「バッチ処理」というやつですね。

バッチにパラメータのセットを追加する

JdbcPreparedStatementオブジェクトのバッチにパラメータのセットを追加するには、addBatchメソッドを使います。

JdbcPreparedStatementオブジェクト.addBatch()

例えば、JdbcPreparedStatementオブジェクトが変数statementに割り当てられている場合、

statement.setString(1, 'Name ' + i);
statement.setString(2, 'Hello, world ' + i);
statement.addBatch();

とすれば、プレースホルダーに設定したSQL文がバッチに追加されるわけです。

バッチに追加されたセットに対してSQL文をまとめて実行する

JdbcPreparedStatementオブジェクトのバッチにパラメータのセットが追加されているのであれば、ひとつのSQL文に対して各セットを当てはめたものを、まとめて一括実行することができます。

バッチに追加されたセットに対してSQL文をまとめて実行するには、executeBatchメソッドを使います。

JdbcPreparedStatementオブジェクト.executeBatch()

戻り値は、各セットに対して更新されたレコード数の配列です。

例えば、以下のような使い方になります。

var statement = conn.prepareStatement('INSERT INTO entries (guestName, content) values (?, ?)');
  for (var i = 0; i < 5; i++) {
    statement.setString(1, 'Name ' + i);
    statement.setString(2, 'Hello, world ' + i);
    statement.addBatch();
  }
var batch = stmt.executeBatch();

Cloud SQLのデータベースへ複数レコード追加の一括実行を確認する

では、複数レコード追加の一括実行についてその動作を確認してみましょう。

まず、実行前の状態が以下だとします。

GASでCloud SQLのデータベースにDELETE文を実行した

それで、これまでの内容をもとに複数レコードを一括で追加する処理として、以下の関数writeManyRecordsとしました。

function writeManyRecords() {
  var connection = Jdbc.getCloudSqlConnection(url, userName, password);

  var statement = connection.prepareStatement('INSERT INTO entries (guestName, content) values (?, ?)');
  for (var i = 0; i < 5; i++) {
    statement.setString(1, 'Name ' + i);
    statement.setString(2, 'Hello, world ' + i);
    statement.addBatch();
  }

  var batch = statement.executeBatch();
  Logger.log(batch);

  statement.close();
  connection.close();
}

これを実行してログを確認すると以下のような内容でした。

GASからCloud SQLへのバッチ処理の戻り値

for文による繰り返しは確かに5回で、各回で1行が更新されているので、そのような出力になっているわけですね。

また、テーブルentriesの内容を確認するために、関数readFromTableを実行してログを見てみましょう。

GASからCloud SQLへのバッチ処理で複数レコードを追加

確かに、複数のレコードがまとめて追加できています。

まとめ

以上、GASのJDBCサービスで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でテーブルを作成する方法
  6. GCPのCloud SQLデータベースのテーブルにSQLでレコードを追加する方法
  7. GASのJDBCサービスでCloud SQLデータベースに接続をする方法
  8. GASのJDBCサービスでCloud SQLデータベースにクエリを実行する方法
  9. GASのJDBCサービスでCloud SQLにクエリを実行した結果を取り出す方法
  10. GASのJBDCサービスでCloud SQLのデータベースにレコードを追加する方法
  11. GASのJDBCサービスでCloud SQLのデータベースに複数のSQLを一括で実行する方法

GASのJDBCサービスでトランザクション処理を行う方法

$
0
0
transaction

photo credit: Tiomax80 Here’s your change! via photopin (license)

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

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

前回の記事はこちら。

GASのJDBCサービスでCloud SQLのデータベースに複数のSQLを一括で実行する方法
GASからJDBCサービスを使ってCloud SQLのデータベースにアクセスする方法をシリーズでお伝えしています。今回は、GASのJDBCサービスでCloud SQLのデータベースに複数のSQLを実行する方法です。

Cloud SQLのデータベースに対して、バッチ処理で複数の更新系SQLを実行する方法をお伝えしました。

ただ、たっっくさんのSQLをバッチで処理するときに、途中でエラーなどの問題が起きた時…データベースどうなっちゃうんですかね?

そんな心配を払拭する「トランザクション処理」というテクニックがあります。

ということで、今回はGASのJDBCサービスでトランザクション処理を行う方法をお伝えします。

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

前回のおさらい

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

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();
}

function writeManyRecords() {
  var connection = Jdbc.getCloudSqlConnection(url, userName, password);

  var statement = connection.prepareStatement('INSERT INTO entries (guestName, content) values (?, ?)');
  for (var i = 0; i < 5; i++) {
    statement.setString(1, 'Name ' + i);
    statement.setString(2, 'Hello, world ' + i);
    statement.addBatch();
  }

  var batch = statement.executeBatch();
  Logger.log(batch);

  statement.close();
  connection.close();
}

関数readFromTableは、Cloud SQLのデータベース「guestbook」内に作成したテーブル「entries」のレコードをログ出力するというものです。

関数writeManyRecordsは、そのテーブル「entries」に、複数のレコードを一括して追加するバッチ処理を行うものです。

トランザクション処理とは

前述で紹介したコードで、実行されるSQLは5件だけですが、これが何百件とあった場合のことを考えてみましょう。

バッチでまとめているとはいえ、SQLステートメントが逐一実行され、その都度データベースに変更が加わります。

その途中で、何らかの不可抗力が発生し、中断してしまったときを考えましょう。

すると、作業を途中から再開しようとしても「あれ?どこまで更新作業進めたっけ?」となってしまいます。

そのような問題を解決するのがトランザクション処理です。

トランザクション処理とは、データベースを利用するシステムにおいて、処理の一貫性を保証するために、関連する一連の処理全体を一個の処理単位として管理する仕組みのことである。

引用: トランザクション処理|IT用語辞書バイナリ

つまり、複数のSQLステートメント実行が全部成功した時だけ、データベースの変更を確定するというしくみです。

バッチ処理のときには、ぜひ使うべきですね。

自動コミットモードをオフにする

では、トランザクション処理の方法について見ていきましょう。

まず、デフォルトではSQLステートメントがひとつ実行されるたびに、その変更が確定する、「自動コミットモード」がオンになっています。

トランザクション処理を使用する場合、この「自動コミットモード」をオフにする必要があります。

それを切り替えるのが、JdbcConnectionオブジェクトのsetAutoCommitメソッドです。

JdbcConnectionオブジェクト.setAutoCommit(自動コミット)

引数「自動コミット」には、モードをオンにするかどうかをブール値で指定します。

ですから、冒頭のコードでは、JdbcConnectionオブジェクトを生成した直後の、27行目に以下の命令を差し込めば、それ以降の処理について自動コミットがなされないようになります。

connection.setAutoCommit(false);

データベースへの一連の変更を確定する

一連のSQLステートメントの実行が完了した時点で、そのすべての変更を確定するという手順を「コミット」といいます。

そのための命令が、JdbcConnectionオブジェクトのcommitメソッドです。

JdbcConnectionオブジェクト.commit()

つまり、37行目の後に以下命令を入れれば、その時点で保留されていた変更がデータベースに確定されるということになります。

connection.commit();

トランザクション処理を加えた更新処理

では、トランザクション処理を加えたコードのまとめです。

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();
}

function writeManyRecords() {
  var connection = Jdbc.getCloudSqlConnection(url, userName, password);
  connection.setAutoCommit(false);

  var statement = connection.prepareStatement('INSERT INTO entries (guestName, content) values (?, ?)');
  for (var i = 0; i < 5; i++) {
    statement.setString(1, 'Name ' + i);
    statement.setString(2, 'Hello, world ' + i);
    statement.addBatch();
  }

  var batch = statement.executeBatch();
  Logger.log(batch);

  connection.commit();
  statement.close();
  connection.close();
}

実行結果は前回のものと同様ですが、一連の処理が成功した時点でデータベースに変更が確定されています。

まとめ

以上、GASのJDBCサービスでトランザクション処理を行う方法をお伝えしました。

複数の更新系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でテーブルを作成する方法
  6. GCPのCloud SQLデータベースのテーブルにSQLでレコードを追加する方法
  7. GASのJDBCサービスでCloud SQLデータベースに接続をする方法
  8. GASのJDBCサービスでCloud SQLデータベースにクエリを実行する方法
  9. GASのJDBCサービスでCloud SQLにクエリを実行した結果を取り出す方法
  10. GASのJBDCサービスでCloud SQLのデータベースにレコードを追加する方法
  11. GASのJDBCサービスでCloud SQLのデータベースに複数のSQLを一括で実行する方法

Apps Scriptダッシュボードでconsoleクラスのログ出力が確認できるようになった

$
0
0

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

さて、みなさんはGoogle Apps Scriptの開発や動作確認で「ログ」って使いますよね?

みなさん大好き「Logger.log」を使われることが多いと思うのですが、実は「console.log」をはじめとする「consoleクラス」のメソッド群も便利に使えるということは知っていますか?

それで、おそらくここ最近だと思いますが、それらがApps Script ダッシュボードでも確認できるようになり、ぐっと使いやすくなりました。

ということで、今回から何回かに分けて、GASの実行ログを確認するconsoleクラスのメソッドを紹介していきます。

まず、Apps Scriptダッシュボードでconsoleクラスによるログ出力を確認する方法です。

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

consoleクラスとは?

「consoleクラス」というのは、GASのスクリプトの実行ログを記録するための機能を提供するクラスです。

みなさんおなじみの「Loggerクラス」と同じく、Script Servicesの「Baseサービス」というところに分類されていまして、いわばGASで横断的に使う基本中の基本の機能という位置づけです。

Logger.logではダメなの?

多くの場合、ログの確認は「Logger.log」でも事足ります。

ただ、例えば時限式トリガーで実行した場合は、doGetやdoPostなどリクエストを受けて動作をさせた場合などを思い出してください。

それら一部のトリガーで動作させた場合、スクリプトエディタを開いて、ログを確認することができませんよね。

また、次に実行すると以前のログは消えてしまいます。

consoleクラスのログのメリット

そんなときに、「console.log」をはじめとする、consoleクラスのメソッドを使うわけです。

  • 各種トリガーで動作した場合のログも記録できる
  • 過去7日間のログを残しておくことができる

…おお、使わない手はないですね!!

ただ、なぜ今まであまりフィーチャーされていなかったのか…

実は、これまでconsoleクラスのログ出力先は、GCPのStackdriver Logging(と、Stackdriver Error Reporting)だったんです。

いや、だからといって有料とか、使いづらいとか、そういうことはなかったのです。

consoleクラスのログがApps Script ダッシュボードで確認できる

ただ、おそらく最近になって、consoleクラスのログ出力がApps Script ダッシュボードでも確認できるようになりました。

ある日、何の気なしに、スクリプトエディタから「表示」 > 「Stackdriver Logging」を開こうとするとこんなメッセージが。

GASのログについてのメッセージ

そこには

「ダッシュボードで表示」
Apps Script ダッシュボードで、このプロジェクトの Stackdriver ログを確認できるようになりました。

Google Cloud Platform でこれらのログを確認したい場合は、この Script 用に別のプロジェクトを設定する必要があります。

とあるじゃないですか。まじか!?

「Stackdriver Error Reporging」を開こうとしても、同様のメッセージが。

ということで、「Apps Script ダッシュボード」はいつもトリガーの設置などで使い慣れているところですから、これを機に触ってみましょう!

consoleクラスのメソッド

Loggerクラスにはlogメソッドしかありませんが、consoleクラスでは複数のメソッドが提供されています。

メソッド レベル 説明
console.log(format, values) DEBUG システムの動作状況に関するログ
console.info(format, values) INFO 何らかの注目すべき情報
console.warn(format, values) WARN 警告。エラーとは言い切れないが近い事柄
console.error(format, values) ERROR エラーに関する事柄

4つとも、基本的な機能は一緒です。

formatには、Logger.logと同様にフォーマット文字列を指定できます。

その文字列に含む「%s」などをプレースホルダーとして、valuesに指定した複数の引数を順番に入れ込んで出力します。

ログレベルとは

さて、これら4つのメソッドの何が違うかというと「ログレベル」です。

重要度や緊急度によってレベル分けがされているんですね。

上のほうがライトな確認用、下にいくほどヤバいレポートとなるわけです。

warnメソッド、errorメソッドあたりは、try~catchなどと組み合わせて使うことが多いんですかね。

consoleクラスのログ出力を確認する

では、実際にこれらconsoleクラスのログ出力について、確認してみましょう。

function logTest() {
  console.log('%s レベルのログ: %s', 'DEBUG', 'ログの内容');
  console.info('%s レベルのログ: %s', 'INFO', 'ログの内容');
  console.warn('%s レベルのログ: %s', 'WARN', 'ログの内容');
  console.error('%s レベルのログ: %s', 'ERROR', 'ログの内容');
}

実行!

それで、Apps Scriptダッシュボードのログ確認へスムーズに行くには、スクリプトエディタの「表示」 > 「実行数」が最も近道ですね。

スクリプトエディタから実行数を開く

するとApps Scriptダッシュボードが開いて、先ほどの実行結果が表示されているので、クリックして展開します。

Apps Scriptダッシュボードの実行数

すると、以下のように各メソッドによるログが確認できます。

しかも、エラーは赤、警告はオレンジに色分けされるんですね。見やすい…!

consoleクラスによる出力ログ

まとめ

以上、Apps Scriptダッシュボードでconsoleクラスによるログ出力を確認する方法をお伝えしました。

トリガーを駆使するスクリプトはもちろん、少し規模のあるプロジェクトだと重宝しそうですね。

ただ、consoleクラスの便利機能…まだあります。

次回は、オブジェクトをログで確認する方法をお伝えします。

どうぞお楽しみに!

【エクセルVBA】リストボックスのListプロパティで複数列の値を更新する

$
0
0

ユーザーフォーム,リストボックス,Listプロパティ

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

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

前回記事では、リストボックスのAddItemメソッドで、リストボックスに、ワークシート範囲以外の値を追加する方法をご紹介しました。

【エクセルVBA】AddItemメソッドでリストボックスに値を追加してみよう!
ユーザーフォームを作って使ってみるまでを目標に、連載記事でコントロールのメソッドやプロパティ、イベントをご紹介しています。今回は、リストボックスにAddItemメソッドを使って値を追加する方法をご紹介しています。

しかしAddItemメソッドのパラメータを見てみると、1列分の値しかセット出来なさそうですよね…

AddItemメソッドでは1列の値しかセットできない…ということは、RowSourceプロパティでワークシートの範囲をセットしないと、VBAでリストボックスに複数列の値をセットすることはできないの?

いえいえ、ちゃんと複数列の値をセットすることができますよ!

ということで今回は、リストボックスのListプロパティで、2列目以降の値を更新する方法をご紹介します!

前回までのおさらい

毎回の記事でご紹介していますが、前回までに作成しているユーザーフォームがこちら。

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

前回は、「品名」のテキストボックスに入力した値からこちらのワークシートを検索して、検索結果をユーザーフォームのリストボックスに、AddItemメソッドで追加していったのでした。

このAddItemメソッドで追加した行の2列目以降の値を、Listプロパティで更新する、というのが今回の主旨です。

Listプロパティとは?

リストボックスのListプロパティは、リストボックスの値の読み書きができるプロパティです。

Listプロパティでリストボックスの値を更新したい場合、下記のように記述します。

ListBoxオブジェクト.List(行, 列) = 値として表示したい内容

パラメータで、読み書き対象の行と列を指定するのですが、この行と列、0から数え始めますので注意が必要です。

Listプロパティでリストボックスの値を取得する

Listプロパティは、リストボックスにすでにある行の値を取得することができます。

例えばこちらのリストボックスの3行目にある値を取得したい場合。

こんなコードで取得することができます。(コマンドボタンのClickイベントを用いています。)

Private Sub btnOK_Click()
  MsgBox ListRegion.List(2, 0)
End Sub

こちらのコードを実行すると…

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

この通りリストボックスの3行目にある値を取得して、メッセージで表示出来ていますね。

Listプロパティでリストボックスの値を更新する

Listプロパティは、リストボックスにすでにある行の値を更新することもできます。

例えばこちらのリストボックスの上から2行目の値を更新したい場合。

このように記述して更新することができます。

Private Sub btnOK_Click()
    MsgBox ListRegion.List(2, 0) = "すだち"
End Sub

そしてこちらのコードを実行すると、

ユーザーフォーム,リストボックス,Listプロパティ,更新

この通り、リストボックスの値を変更することができます。

AddItemメソッド行を追加して列の値をListプロパティで更新する

先に述べた通り、リストボックスのAddItemメソッドでは、リストボックスに新しい行を追加してくれます。

しかし、リストボックスのColumnCountプロパティで2以上の値が設定されていた(複数列の設定になっていた)としても、AddItemメソッドのパラメータで指定できるのは1列目にあたる値のみ。

そこでListプロパティとセットで使えば、新しく追加した行の2列目以降の値も更新することができます。

こんな感じで。

Private Sub TextItem_AfterUpdate()
    With ListRegion
        Dim i As Long
        i = .ListCount
        .AddItem TextItem.Value, i
        .List(i, 1) = TextItem.Value & "2列目"
        .List(i, 2) = TextItem.Value & "3列目"
    End With
End sub

AddItemメソッドでリストボックスに新しい行を追加して、1列目にはAdditemメソッドのパラメータでテキストボックスに入力された値をセットし、2,3列目はListプロパティで値を指定する、というコードです。

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

ユーザーフォーム,リストボックス,Listプロパティ,複数列

この通り、2,3列目の値も更新されていますね。

もちろん、リストボックスのColumnCountプロパティの値を2以上に変更しておきましょう。

最後に

今回は、リストボックスのListプロパティで、複数列の値をセットする方法をご紹介しました。

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のconsoleクラスのメソッドで実行時間をログ出力する方法

$
0
0

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

GASでconsoleクラスを使ってApps Scriptダッシュボードにログを出力する方法をお伝えしています。

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

Apps Scriptダッシュボードでconsoleクラスのログ出力が確認できるようになった
GASの動作確認で「ログ」使いますよね?実は、Logger.logとは別にconsoleクラスも使えると便利です。今回はApps Scriptダッシュボードでconsoleクラスによるログ出力を確認する方法です。

consoleクラスによるApps Scriptダッシュボードへのログ出力の方法についてお伝えしました。

さて、consoleクラスには実行時間を測定するためのメソッドも用意されています。

ということで、今回はGASのconsoleクラスのメソッドで実行時間をログ出力する方法です。

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

GASで実行時間を測定するには

GASで実行時間を測定するには、「実行トランスクリプト」を使うことができます。

例えば、以下のような一定時間(3000ミリ秒)を経過させるだけの関数myFunctionを作ってみました。

function myFunction(){
  Utilities.sleep(3000);
}

これをスクリプトエディタ上で実行して、スクリプトエディタの「表示」> 「実行トランスクリプト」を選択します。

すると、以下のように実行時間を確認することができます。

GASの実行トランスクリプト

合計ランタイム 3.003秒

ただ、これを確認できるのはスクリプトエディタを開けるときだけですね。

トリガーで実行したときなど、どこかに実行時間を記録しておきたい…というときもあります。

そのようなときのために、consoleクラスに便利なメソッドが用意されています。

consoleクラスで実行時間をログ出力する

cosoleクラスのtimeメソッド、timeEndメソッドを使用すると、関数の実行時間についてApps Scriptダッシュボードにログを出力することができます。

timeメソッドは、新たなタイマーをスタートします。

console.time(ラベル)

ラベルで指定した文字列が、スタートしたタイマーのタイマー名になります。

それで、タイマーを止めてタイマーの時間をログ出力するには、timeEndメソッドを使用します。

console.timeEnd(ラベル)

ラベルには、すでにスタートしているストップしたいタイマー名を指定します。

実行時間のログ出力を確認する

では、これらのconsoleクラスのメソッドを使って、前述の関数myFunctionの実行時間をログ出力してみましょう。

以下のようなコードになります。

function logTime() { 
  var label = 'myFunction() time'
  console.time(label); 
  myFunction();
  console.timeEnd(label);
}

これを実行して、Apps Scriptダッシュボードを確認してみましょう。

consoleクラスによるApps Scriptダッシュボードへの実行時間のログ

myFunction() time: 3003ms

このように、きちんとタイマー名と実行時間が出力されていることが確認できます。

まとめ

以上、GASでconsoleクラスを使ってApps Scriptダッシュボードにログを出力する方法をお伝えしました。

このように、実行時間についてもApps Scriptダッシュボードに出力できますね。

これまで、トリガーなどで動作させた場合は、スプレッドシートやドキュメントにログ出力するような工夫が必要でしたが、consoleクラス&Apps Scriptダッシュボードのおかげで、その必要はもうなくなりましたね。

また、console.logについての便利な使い方があれば紹介しますね。

どうぞお楽しみに!

連載目次:GASのconsoleクラスでダッシュボードにログ出力

GASのログは「Logger.log」がメジャーですが、「consoleクラス」のメソッド群も使えるようになると色々と便利です。このシリーズでは、consoleクラスを使ってApps Scriptダッシュボードにログを出力する方法をお伝えしていきます。
  1. Apps Scriptダッシュボードでconsoleクラスのログ出力が確認できるようになった

GASでGoogleスライドのプレゼンテーションを操作するはじめの一歩

$
0
0

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

弊社では、コミュニティ「ノンプロ研」や企業さま向けの研修で、Googleスライドでプレゼンテーションを作成する機会がとても多くあります。

全部をいちから作るのはたいへん…なので、いくつかの可能な段取りを自動化できれば便利ですよね。

ということで、そのようないくつかのアイデアについて、シリーズとして紹介していきたいと思います。

ちなみに、このシリーズで紹介するツールは、講座用プレゼンテーションだけでなく、定例会議用資料や、レポートなど、一定のフォーマットを使い回すようなプレゼンテーション全般に応用できるはずです。

初回の今回は、まず実現したいことの説明と、スライドを操作する超カンタンなスクリプトを実行するところまでです。

ということで、GASでGoogleスライドのプレゼンテーションを操作するはじめの一歩についてです。

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

今回のシリーズでやりたいこと

毎回の講座プレゼンテーション作成作業

以下のような、講座のテンプレートとなるプレゼンテーションがあります。

テンプレートとなるプレゼンテーション

タイトルや、冒頭の自己紹介・アイスブレイクは、毎回のレッスンで共通なので、これをコピーして、各レッスン用のプレゼンテーションを作っていきます。

ファイル名や、講座名、コース名などは、毎回のレッスンで異なりますので、それらの部分を書き換えるという作業が発生します。

それらが終わったら、メインのコンテンツ部分のスライドを作成していくという流れです。

プレゼンテーション作成の一部の自動化

ただ、このテンプレートのコピーと、ファイル名やテキストの置換作業…スプレッドシートに置換についてのルールを記載しておけば、スクリプトで自動化できそうですよね。

例えば、これらのようなシートを用意しておきます。

こちらが「ファイル名」用の置換ルール

テンプレートのファイル名の「{YYMMDD}{講座名}{コース名}-{NN}」の波かっこの文字列を置換していくイメージです。

ファイル名用の置換ルールを記載したシート

こちらが「テキスト」用の置換ルール

テキストボックス内にあらかじめ埋め込んでいる「{講座名}」「{コース名}」などの波かっこの文字列を置換していきます。

テキスト用の置換ルールを記載したシート

GASでGoogleスライドを操作する最初の一歩

スプレッドシートのコンテナバインドスクリプトを新規作成

では、準備をはじめていきましょう。

今回、主に操作する対象はGoogleスライドなのですが、スクリプトの動作についてルールを記載しているのはスプレッドシートということから、スプレッドシートのコンテナバインドスクリプトとして作成していきましょう。

ちなみに、コンテナバインドというのは、コンテナ(今回はスプレッドシート)に紐づくスクリプトを作成する作り方です。

スプレッドシートのメニュー「ツール」>「スクリプトエディタ」を選択します。

スプレッドシートからスクリプトエディタを開く

スクリプトエディタが開きました。

スクリプトエディタを開いた

スクリプト入力と実行

そしたら、以下のスクリプトを入力してみましょう。

function myFunction() {
  
  var url ='*****テンプレート用プレゼンテーションのURL*****';
  var presentation = SlidesApp.openByUrl(url);
  Logger.log(presentation.getName());
  
}

ここで変数urlに指定する文字列は、テンプレート用プレゼンテーションファイルを開いたときのURLです。

ブラウザのURLボックスからコピーして、スクリプト内にペーストすればOKです。

プレゼンテーションのURL

プルダウンに実行する関数名「myFunction」を選択している状態で「▶」アイコンクリックで実行できます。

スクリプトを実行

ちなみに、スクリプトの実行はショートカットキーの Ctrl + R または command + R でもいけます。

スクリプトの保存とプロジェクト名

するとダイアログが表示されて、「保存」を促されるので「はい」をクリックします。

GASのスクリプトは自動保存ではないので注意です。

スクリプトを保存するかどうかのメッセージ

続いて、まだプロジェクト名を決めていなかったので、ここで入力を求められます。

「講座スライド作成」などという名前にして「OK」です。

プロジェクト名の入力

プレゼンテーションへのアクセス許可

再度実行すると、今度はAuthorizationつまり「アクセス許可」をする必要があります。

「このプロジェクトのスクリプトから、目的のプレゼンテーションにアクセスしていいよ~」ということを許可する手順です。

まずは「許可を確認」をクリック。

プロジェクトからのアクセスの許可を確認

続いて開いたダイアログで、アカウントを選択します。

アカウントを選択する

もう一つダイアログが開くので「許可」をクリック。

アクセスのリクエストを許可

これでアクセスの許可ができました。

ログの確認

同時に実行も行われたはずなので、ログを確認します。

スクリプトエディタのメニューから「表示」>「ログ」です。

これは Ctrl + Enter のショートカットキーでもOKです。

スクリプトエディタでログを表示

すると、ログの画面で以下のように、URLを取得したテンプレート用プレゼンテーションの名前が表示されるはずです。

ログに表示されたプレゼンテーション名

つまり、プレゼンテーションにアクセスできたということですね。

まとめ

以上、GASでGoogleスライドのプレゼンテーションを操作するはじめの一歩についてお伝えしました。

次回から、具体的にGoogleスライドを操作するスクリプトについて紹介していきますね。

どうぞお楽しみに!

GASでGoogleスライドを操作するSlideAppサービスの基礎の基礎

$
0
0
open

photo credit: roadscum Light Haulage via photopin (license)

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

GASでGoogleスライドのプレゼンテーションを楽々作成するテクニックについてシリーズでお伝えしています。

前回の記事はこちら!

GASでGoogleスライドのプレゼンテーションを操作するはじめの一歩
GASでGoogleスライドのプレゼンテーションを操作する方法についてのシリーズがはじまりました。まずは、GASでGoogleスライドのプレゼンテーションを操作するはじめの一歩をお伝えします。

シリーズの中でまず実現したいことの解説と、スクリプトの準備、そして実行のテストまでを終えました。

ただ、前回実行したスクリプトについて解説がまだでしたので、今回解説していきますよ。

ということで、GASでGoogleスライドを操作するSlideAppサービスの基礎の基礎をお伝えします。

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

前回のおさらい

前回は、まずプレゼンテーションを作成するためのルールを記述するためのスプレッドシートを準備しました。

そして、そのコンテナバインドスクリプトでプロジェクトを作成して、以下のようなスクリプトを実行しました。

function myFunction() {
  
  var url ='*****テンプレート用プレゼンテーションのURL*****';
  var presentation = SlidesApp.openByUrl(url);
  Logger.log(presentation.getName());
  
}

実行結果として、以下のようにプレゼンテーションのタイトルがログに出力されました。

ログに表示されたプレゼンテーション名

ただ、こちらのスクリプト。

解説をまだしていなかったので、今回進めていきますね。

Slidesサービスの基礎の基礎

SlidesサービスとSlidesAppオブジェクト

GASでGoogleスライドを操作する機能は「Slidesサービス」として提供されています。

「SlidesApp」は、そのSlidesサービスのトップレベルのオブジェクトです。

どういうことかというと、GASでGoogleスライドに対して何かしようとした場合、まずこのSlidesAppオブジェクトのいずれかのメソッドを使用することからはじまります。

前述のスクリプトでは、4行目がそれにあたるわけですね。

URLを指定してプレゼンテーションを開く

それで、その4行目ですが、SlidesAppオブジェクトのopenByUrlメソッドという命令を使っています。

openByUrlメソッドは、URLを指定してプレゼンテーションを開く命令です。

以下のように記述します。

SlidesApp.openByUrl(URL)

Googleスライドでは、プレゼンテーションに対して、そのURLが一意に決められていますので、URLさえわかれば特定のプレゼンテーションを特定でき、開くことができるのです。

ちなみに、URLにはプレゼンテーションIDも含まれています。

プレゼンテーションのURLは以下のような構成になっていますが「{ID}」で示した部分が、プレゼンテーションIDとなります。

https://docs.google.com/presentation/d/{ID}/edit#

このIDを文字列として指定することで、プレゼンテーションを特定するopenByIdメソッドも用意されていますので、合わせて覚えておくとよいでしょう。

SlidesApp.openById(ID)

Presentationオブジェクトとは

ここでは「開く」といっても、実際にブラウザで開くわけではなく、指定したURLのプレゼンテーションを「Presentationオブジェクト」として取得します。

それを「presentation」という変数に代入したわけです。

Presentationオブジェクトとして取得することで、またそれに対する操作を行うメソッドがたくさん用意されていて、さまざまな操作を行うことができるのです。

前述の例では5行目のgetNameメソッドで、その名前、すなわちプレゼンテーション名をログ出力していますね。

書式は以下のとおりです。

Presentationオブジェクト.getName()

今回指定したプレゼンテーションのURLは、「{YYMMDD}{講座名}{コース名}-{NN}」というタイトルのプレゼンテーションでしたね。

まとめ

以上、GASでGoogleスライドを操作するSlideAppサービスの基礎の基礎についてお伝えしました。

今回、ポイントだったのは以下の3点ですね。

  • GoogleスライドはGASのSlidesサービスで操作できる
  • Slidesサービスは必ずSlideAppオブジェクトのメソッドからスタートする
  • URL(またはID)がわかればPresentationオブジェクトを特定し取得できる

次回は、プレゼンテーションの構成についてお伝えします。

どうぞお楽しみに!

連載目次:GASでGoogleスライドのプレゼンテーションを楽々作成

定例会議用資料、レポート、プレゼンテーションなど、テンプレートをもとにGoogleスライドのプレゼンテーションを作るというお仕事はけっこうあります。全部は無理にしても、いくつかの段取りは、GASを使って自動化できるかも…!?このシリーズでは、そのようなGoogleスライドのプレゼンテーション自動化のアイデアと、スクリプトの書き方を紹介します!
  1. GASでGoogleスライドのプレゼンテーションを操作するはじめの一歩

【エクセルVBA】ユーザーフォームにコンボボックスを追加する方法

$
0
0

ユーザーフォーム,コンボボックス

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

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

前回の記事では、リストボックスのListプロパティで、複数列の値をセットする方法をご紹介しました。

今回はユーザーフォームでよく使われる、コンボボックスをフォームに追加して、プロパティを設定していってみましょう!

コンボボックスとは

まずは、コンボボックスの見た目のご紹介から。

コンボボックスは、こんな見た目をしたコントロールです。

ユーザーフォーム,コンボボックス,見た目

ユーザーフォームでちょっとしたツールを作りたい時によく使われるコントロールではないでしょうか。

リストボックスは、予めセットした値をリスト形式で表示してくれましたが、表示された値を選択することはできても、テキストを入力することはできませんでしたよね。

コンボボックスは、予めセットした値をリスト形式で表示したり、テキストを入力したりすることができるコントロールです。

ユーザーフォームにコンボボックスを追加する

コンボボックスをユーザーフォームに追加してみましょう。

追加するユーザーフォームはこちら。

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

これまでの連載記事でコントロールを追加してきた、「MyForm」というフォームです。

こちらのフォームにコンボボックスを追加するには、VBEでツールボックスを開いて、コンボボックスのアイコンをクリックします。

ユーザーフォーム,コンボボックス,ツールボックス

そしてコンボボックスを追加したい場所をフォーム上でドラッグすると…

ユーザーフォーム,コンボボックス,追加

こんな感じで、コンボボックスを追加することができます。

コンボボックスを追加するため、予め隣のテキストボックスの幅を少し狭めておきました。

ツールボックスが表示されていない!という方は、こちらの記事を参考になさってくださいね。

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

コンボボックスのプロパティ

コンボボックスを追加できたら、お次はプロパティを設定していきましょう。

本稿ではコンボボックスのプロパティの中から、いくつかピックアップしてご紹介していきます。

プロパティシートを開く

プロパティを設定するために、コンボボックスのプロパティシートを開いてみましょう。

フォーム上に追加したコンボボックスを右クリックして、現れたメニューから「プロパティ」をクリックします。

すると、このようにコンボボックスのプロパティシートが表示されます。

ユーザーフォーム,コンボボックス,プロパティシート

このシート上で、プロパティを設定していきましょう。

オブジェクト名を変更する

フォームやテキストボックス同様、コンボボックスもオブジェクト名を変えることができます

デフォルトでは自動的にComboBox1のようなオブジェクト名になっていますが、VBAで操作するときにわかりやすいように、判別し易い名前にしておくとよいでしょう。

今回は、「CmbUnit」というオブジェクト名に変えておきます。

ユーザーフォーム,コンボボックス,オブジェクト名

入力した文字からリスト内を検索してくれる:MatchEntryプロパティ

コンボボックスでは、入力したテキストがリスト内にあるかを検索することができます。

このプロパティは、入力したテキストから部分検索、完全一致のどちらにするのか、また、そもそも検索をさせないという3パターンの設定から選択することができます。

このプロパティに設定する値は、以下のいずれかです。

設定値 動作
0 – fmMatchEntryFirstLetter 部分検索
1 – FmMatchEntryComplete 完全一致検索
2 – FmMatchEntryNone 検索をしない

たとえばプロパティの設定値を「0 – fmMatchEntryFirstLetter」にしていた場合。

こちらのコンボボックスに「パ」と入力して…

ユーザーフォーム,コンボボックス,matchentry

エンターキーを押すと、このように入力した値にマッチする値をリストから検索して、自動的に表示してくれます。

ユーザーフォーム,コンボボックス,matchentry,結果

リスト内にある文字だけを入力させる:MatchRequiredプロパティ

MatchRequiredプロパティは、テキスト入力された値が、コンボボックスのリスト内に存在しているかをチェックしてくれるプロパティです。

設定値はTrueかFalseのいずれかで、Trueを設定した場合、リスト内に無い値をテキストボックスに入力すると、このようなメッセージが表示されます。

ユーザーフォーム,コンボボックス,matchrequire

メッセージは表示されるものの、テキストには自由な値が入力できますので、チェック機能として使うことができるかもしれません。

ただし、メッセージの文面が分かりにくいのが難点ですね。

こちらのプロパティに「False」を設定すれば、メッセージが表示されることなく、自由な値を入力することができます。

コントロールをどう使うかを決める:Styleプロパティ

Styleプロパティは、コンボボックスをコンボボックスとして使うか、ドロップダウンリストとして使うかを設定するプロパティです。

設定値は以下のいずれかです。

設定値 動作
0 – fmStyleDropDownCombo コントロールをコンボボックスとして使用する
1 – fmStyleDropDownList コントロールをドロップダウンリストとして使用する

コンボボックスはリストボックスとテキストボックスを足したようなコントロールなのですが、Styleプロパティで「1 – fmStyleDropDownList」を設定すると、テキスト入力ができなくなり、リストからの選択のみできるようになります。

コンボボックスをドロップダウンリストとして使うことができるようになるということですね。

「0 – fmStyleDropDownCombo」を設定すれば、テキスト入力もリストからの選択も両方できる、コンボボックスとして使用することができますよ。

最後に

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

コンボボックスは、ユーザーフォームではよく使われる、便利なコントロールです。

次回は、この便利なコンボボックスに値をセットしていってみましょう。

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

連載目次:【エクセル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イベントでワークシートを更新してみよう
  9. 【エクセルVBA】ユーザーフォームのリストボックスを使ってみよう!
  10. 【エクセルVBA】リストボックスのRowSourceプロパティの値を変動させてみよう!
  11. 【エクセルVBA】AddItemメソッドでリストボックスに値を追加してみよう!
  12. 【エクセルVBA】リストボックスのListプロパティで複数列の値を更新する

 


GASでGoogleスライドのSlideオブジェクトの概要とその取得方法

$
0
0

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

GASでGoogleスライドのプレゼンテーションを楽々作成するテクニックについてシリーズでお伝えしています。

前回の記事はこちら!

GASでGoogleスライドを操作するSlidesサービスの基礎の基礎
GASでGoogleスライドのプレゼンテーションを楽々作成するテクニックについてシリーズでお伝えしています。今回は、GASでGoogleスライドを操作するSlideAppサービスの基礎の基礎をお伝えします。

GASでGoogleスライドを操作するSlidesサービスの基礎についてお伝えしました。

前回は、プレゼンテーションを表すPresentationオブジェクトについて簡単に紹介しましたので、今回はその配下にあるSlideオブジェクトについて紹介します。

ということで、GASでGoogleスライドのSlideオブジェクトの概要とその取得方法です。

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

前回のおさらい

前々回、前回と以下のスクリプトにお世話になりました。

function myFunction() {
  
  var url ='*****テンプレート用プレゼンテーションのURL*****';
  var presentation = SlidesApp.openByUrl(url);
  Logger.log(presentation.getName());
  
}

プレゼンテーションごとに一意に決まるURLを用いて、プレゼンテーションをPresentationオブジェクトとして取得、そしてその名前すなわちプレゼンテーション名をログ出力するというものでした。

Slidesサービスで「もの」をどのように扱うか

ところで、Googleスライドのプレゼンテーションは、いくつかのスライドで構成されていて、さらに個々のスライド上にテキストボックスや図形、画像、表など、さまざまな「もの」を配置することができますよね。

実際にGASでスクリプトを書くときは、それらの「もの」を操作することが多いわけですが、GASではどのような扱いになっているのでしょうか?

今回の記事では、Slidesサービスで、スライドやスライド上の「もの」をどのように扱うのか、その概要をみていくことにしましょう。

Slidesサービスのオブジェクト構成

GASでは、プレゼンテーションやスライド、スライド上の「もの」を「オブジェクト」として操作します。

前回まででお伝えしたSlidesサービスのトップレベルオブジェクトであるSlideAppオブジェクトや、「プレゼンテーション」を表すPresentationオブジェクトなど、操作対象ごとに異なる種類のオブジェクトとなります。

そして、それらオブジェクトには親子関係があって、SlideAppオブジェクトの配下に、Presentationオブジェクトが、そしてその配下にスライドを表すオブジェクトが…という階層構造となっています。

主なものの一部だけ抽出すると、Slidesサービスでは以下のようなオブジェクトと階層構造になっています。

SlideAppオブジェクト: トップレベルオブジェクト
Presentationオブジェクト: プレゼンテーション
 └Slideオブジェクト: スライド
  └Shapeオブジェクト: テキストボックス、図形などのシェイプ
   └TextRangeオブジェクト: テキスト範囲

そして、その種類に応じてそれを操作するためのメソッドが用意されており、そのメソッド群を使ってさまざまな操作を行うことができます。

Slideオブジェクトを取得する

では、前述の階層構造の次の段階である、スライドの部分の取得について、実際にスクリプトを動かして確認していきましょう。

Presentationオブジェクトは、その配下にスライドを表すSlideオブジェクトを持ちます。

Presentationオブジェクトから、Slideオブジェクトを取り出すには、getSlidesメソッドを使います。

Presentationオブジェクト.getSlides()

ここで、メソッド名が「getSlides」と複数形となっていますね。

プレゼンテーションには複数のスライドが含まれますので、getSlidesメソッドは複数のスライドを、Slideオブジェクトの配列として取得するのです。

以下のスクリプトを実行してみましょう。

function myFunction() {
  
  var url ='*****テンプレート用プレゼンテーションのURL*****';
  var presentation = SlidesApp.openByUrl(url);
  var slides = presentation.getSlides();
  Logger.log('スライドの枚数: %s',slides.length);

  var slide = slides[0];

}

実行すると、以下のようにログでslidesに含まれる要素数、すなわちスライドの枚数が確認できます。

GASでスライドの枚数をログ出力

8行目では、インデックス0のSlideオブジェクトを取り出していますが、これは1ページ目のスライドを表しますね。

このようにして、単体のSlideオブジェクトを取り出すことで、Slideオブジェクトのメソッドを使用することができるようになります。

まとめ

以上、GASでGoogleスライドのSlideオブジェクトの概要とその取得方法についてお伝えしました。

スライドの取得についてのポイントは以下のとおりですね。

  • スライドはPresentationオブジェクトからgetSlidesメソッドで取得
  • その際に配列での取得になるので、インデックスで取り出す

次回は、さらにその配下にある「シェイプ」について見ていきます。

どうぞお楽しみに!

連載目次:GASでGoogleスライドのプレゼンテーションを楽々作成

定例会議用資料、レポート、プレゼンテーションなど、テンプレートをもとにGoogleスライドのプレゼンテーションを作るというお仕事はけっこうあります。全部は無理にしても、いくつかの段取りは、GASを使って自動化できるかも…!?このシリーズでは、そのようなGoogleスライドのプレゼンテーション自動化のアイデアと、スクリプトの書き方を紹介します!
  1. GASでGoogleスライドのプレゼンテーションを操作するはじめの一歩
  2. GASでGoogleスライドを操作するSlidesサービスの基礎の基礎
  3. GASでGoogleスライドのSlideオブジェクトの概要とその取得方法

【エクセルVBA】コンボボックスに値をセットする2つの方法 RowSourceプロパティとAddItemメソッド

$
0
0

 

ユーザーフォーム,コンボボックス皆様こんにちは、ノグチです。

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

前回は、ユーザーが値を入力したり、リストから選択したりできるコンボボックスをユーザーフォームに挿入する方法と、プロパティをいくつかご紹介しました。

【エクセルVBA】ユーザーフォームにコンボボックスを追加する方法
ユーザーフォームを作って使ってみるまでを目標に、連載記事でコントロールのメソッドやプロパティ、イベントをご紹介しています。今回の記事では、コンボボックスをフォーム上に追加する方法と、代表的なプロパティをいくつかご紹介しています。ユーザーフォームでツールを作りたいとき、使い勝手のよいコントロールですよ!

今回は、このコンボボックスに値をセットする方法のご紹介です。

コンボボックスのRowSourceプロパティでセットする方法と、コンボボックスのAddItemメソッドを使って値を追加する方法の2通りをご紹介していきますよ。

前回までのおさらい

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

ユーザーフォーム,コンボボックス,おさらい用

前回の記事では、画面上部右側にあるコンボボックスを追加して、「CmbUnit」というオブジェクト名を付けたのでした。

今回は、このコンボボックスに値をセットしていきましょう。

コンボボックスに値をセットする2つの方法

今回の記事では、コンボボックスに値をセットする方法として以下の2つの方法をご紹介していきます。

  • RowSourceプロパティで、コンボボックスにセットしたい値があるワークシート上の範囲を指定する
  • ComboBoxオブジェクトのAddItemメソッドで新規アイテムを追加する方法

リストボックスでもご紹介した方法とほぼ同じですね。

【エクセルVBA】リストボックスのRowSourceプロパティの値を変動させてみよう!
エクセルのユーザーフォームを作って使うことを目標に、連載記事でコントロールのメソッドやプロパティ、イベントをご紹介しています。今回は、リストボックスのRowSourceプロパティをVBAで指定することで、他のコントロールの入力値によってリストボックスに表示する値を変動させる方法をご紹介しています。
【エクセルVBA】AddItemメソッドでリストボックスに値を追加してみよう!
ユーザーフォームを作って使ってみるまでを目標に、連載記事でコントロールのメソッドやプロパティ、イベントをご紹介しています。今回は、リストボックスにAddItemメソッドを使って値を追加する方法をご紹介しています。

早速RowSourceプロパティを使う方法から見ていきましょう。

RowSourceプロパティでワークシート範囲を指定する

まず1つめの、コンボボックスに表示したいリストがあるワークシート上の範囲を、RowSourceプロパティに指定する方法です。

例えば、こちらのワークシートのA2セルからA6セルの範囲を、コンボボックスに表示したい場合。

コンボボックス,ワークシート

プロパティシートのRowSourceプロパティの値に、このように「A2:A6」と入力します。

コンボボックス,プロパティシート

すると、このようにコンボボックスに指定したワークシート範囲の値が表示されるようになります。

コンボボックス,リスト表示,rowsource

AddItemメソッドで値を追加する

もう一つの方法、こちらはVBAから更新していきます。

ComboBoxオブジェクトのAddItemメソッドで、アイテムを追加する方法です。

記述方法はこちら。

ComboBoxオブジェクト.AddItem 追加したい値(文字列型), 追加したい順序(数値型)

追加したい順序は省略可能です。

省略した場合、自動的にコンボボックス内のリストの一番最後に追加されますよ。

AddItemメソッドでコンボボックスに入力した値をリストに追加してみる

早速、AddItemメソッドを使って、コンボボックスに値を追加してみましょう。

コードはこちら。

Private Sub TextItem_AfterUpdate()
    With CmbUnit
        .AddItem TextItem.Value
    End With
End Sub

テキストボックスに入力した値を、コンボボックスの値にセットするコードです。

今回はテキストボックスのAfterUpdateイベントに入れてみました。

このコードを保存して、テキストボックスに値を入れてみると…

コンボボックス,リスト表示,additem

この通り、テキストボックスに入力した値が、コンボボックスの値に追加されていますね。

値をセットする方法はどちらかに統一する

リストボックスでも触れましたが、同一のコンボボックスに対して、RouwSourceプロパティとAddItemメソッドの両方を使って値を更新することはできません。

正確に言うと、RowSourceプロパティにワークシート範囲を指定していた場合は、AddItemメソッドで値を追加することができませんし、VBAからAddItemメソッドで値を追加した後にRowSourceプロパティに範囲をセットすると、AddItemメソッドで追加した値がRowSourceプロパティで指定した範囲の値で上書きされてしまいます。

コンボボックスの値をセットする方法は、RowSourceプロパティを使うか、AddItemメソッドを使うかのどちらかの方法に統一するようにしましょう。

最後に

今回は、コンボボックスに値をセットする方法として、RowSourceプロパティにワークシート範囲を指定する方法と、AddItemメソッドで新規アイテムを追加する方法の2つをご紹介しました。

以前の記事でご紹介した、リストボックスと同じセット方法ですね。

リストボックスとコンボボックスは、どちらもコントロール名に「ボックス」とつきますし、値が選択できるということで混同してしまうこともあるかもしれません。

しかし、コントロールに値をセットした後の見た目や、テキストが入力できる・できないなど、違いはしっかりありますので、目的に応じて使い分けていきましょう。

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

GASでGoogleスライドのテキストボックスや図形などを取得する方法

$
0
0
shapes

photo credit: FolsomNatural shapes1 via photopin (license)

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

GASでGoogleスライドのプレゼンテーションを楽々作成するテクニックについてシリーズでお伝えしています。

前回の記事はこちら!

GASでGoogleスライドのSlideオブジェクトの概要とその取得方法
GASでGoogleスライドのプレゼンテーションを楽々作成するテクニックについてシリーズでお伝えしています。今回は、GASでGoogleスライドのSlideオブジェクトの概要とその取得方法です。

GoogleスライドのSlideオブジェクトとその取得方法についてお伝えしました。

Slideオブジェクトはまさに一枚一枚のスライドを表すオブジェクトなのですが、実際にはそのスライド上のテキストボックスだったり、図形だったりを操作することも多くありますよね。

それらを「シェイプ」といい、GASのSlidesサービスでは、それらを「Shapeオブジェクト」として扱います。

ということで、今回はGASでGoogleスライドのテキストボックスや図形などを取得する方法についてお伝えします。

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

前回のおさらい

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

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

function myFunction() {
  
  var url ='*****テンプレート用プレゼンテーションのURL*****';
  var presentation = SlidesApp.openByUrl(url);
  var slides = presentation.getSlides();
  Logger.log('スライドの枚数: %s',slides.length);

  var slide = slides[0];

}

プレゼンテーションをURLで特定して開き、そのすべてのスライドを配列として変数slidesに格納します。

その配列の要素数、つまりスライド数をログ出力するというものですね。

そして、配列からひとつ目のインデックス0の要素を取得したのが、8行目ということになります。

PageElementオブジェクトとは

このようにしてスライドをSlideオブジェクトとして取得できましたが、そのスライド上には、テキストボックスや画像などの色々な「もの」が配置されていますよね。

GASのSlidesサービスでは、それをPageElementオブジェクトとして扱います。

ですが、PageElementオブジェクトは、種類に応じて以下のように分かれています。

オブジェクト 説明
Shapeオブジェクト テキストボックス、図形などのシェイプ
Lineオブジェクト
Imageオブジェクト 画像
SheetChartオブジェクト スプレッドシートからインポートされたグラフ
Videoオブジェクト 動画
Tableオブジェクト
WordArtオブジェクト ワードアート
Groupオブジェクト グループ化されたPageElementオブジェクト

えー、たくさんあってヤダ~となるかも知れませんね。

その通りです!

Slideオブジェクトから、スライド上のPageElementオブジェクトを配列としてまとめて取得することもできますが、いろいろな種類のオブジェクトが混在するので、かえって扱いづらいです。

そんなときには、目的の種類のオブジェクトだけを選別して取得することができます。

他のオブジェクトについては、そのあとに必要に応じて調べてマスターしていけばOK!

Shapeオブジェクトを取得する

例えば、PageElementオブジェクトの中で最も操作することが多いのは、テキストボックスや図形などの「シェイプ」を表すShapeオブジェクトです。

テキストボックスを取得して、そのテキストを入力・変更したり、フォントに変更を加えたり…といった操作が予想されますね。

Slideオブジェクトが取得できているとして、その配下のShapeオブジェクトを取得するには、getShapesメソッドを使います。

Slideオブジェクト.getShapes()

「getShapes」とある通り、このメソッドは複数のShapeオブジェクトを配列として取得します。

では、試しに以下のスクリプトを実行してみましょう。

function myFunction() {
  
  var url ='*****テンプレート用プレゼンテーションのURL*****';
  var presentation = SlidesApp.openByUrl(url);
  var slide = presentation.getSlides()[0];
  var shapes = slide.getShapes();
  
  Logger.log('シェイプの個数: %s',shapes.length);
  
  var shape = shapes[0];

}

実行後にログを確認すると、以下のように変数shapesに含まれる要素数、つまりスライドに含まれるシェイプの数を確認することができます。

スライドに含まれるシェイプの個数をログ出力
そして、10行目では、インデックス0のShapeオブジェクトを取り出しています(ここでは、どのシェイプを表すのか、いまいちわかりませんが…)。

まとめ

以上、GASでGoogleスライドのテキストボックスや図形などを取得する方法についてお伝えしました。

ポイントは以下のとおりです。

  • Shapeオブジェクトはテキストボックスや図形などのシェイプを表す
  • シェイプはSlideオブジェクトのgetShapesメソッドで取得する
  • 取得したシェイプは配列

では、次回取得したシェイプのテキストの取り出し方について見ていきましょう。

どうぞお楽しみに!

連載目次:GASでGoogleスライドのプレゼンテーションを楽々作成

定例会議用資料、レポート、プレゼンテーションなど、テンプレートをもとにGoogleスライドのプレゼンテーションを作るというお仕事はけっこうあります。全部は無理にしても、いくつかの段取りは、GASを使って自動化できるかも…!?このシリーズでは、そのようなGoogleスライドのプレゼンテーション自動化のアイデアと、スクリプトの書き方を紹介します!
  1. GASでGoogleスライドのプレゼンテーションを操作するはじめの一歩
  2. GASでGoogleスライドを操作するSlidesサービスの基礎の基礎
  3. GASでGoogleスライドのSlideオブジェクトの概要とその取得方法

GASでGoogleスライドのテキストボックスの文字列を取得する方法

$
0
0
text

photo credit: davidseibold Off To The Side via photopin (license)

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

GASでGoogleスライドのプレゼンテーションを楽々作成するテクニックについてシリーズでお伝えしています。

前回の記事はこちら!

GASでGoogleスライドのテキストボックスや図形などを取得する方法
GASでGoogleスライドのプレゼンテーションを楽々作成するテクニックについてお伝えしています。今回はGASでGoogleスライドのShapeオブジェクトの概要とその取得方法についてお伝えします。

Googleスライドのテキストボックスや図形を表すシェイプとその取得方法についてお伝えしました。

操作対象となるシェイプがテキストボックスだった場合、その内部のテキストも操作したくなったりしますよね。

GASではShape内のテキストは「TextRangeオブジェクト」として扱います。

ということで、今回はGASでGoogleスライドのテキストボックスの文字列を取得する方法についてお伝えします。

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

前回のおさらい

前回作成したコードはこちら。

function myFunction() {
  
  var url ='*****テンプレート用プレゼンテーションのURL*****';
  var presentation = SlidesApp.openByUrl(url);
  var slide = presentation.getSlides()[0];
  var shapes = slide.getShapes();
  
  Logger.log('シェイプの個数: %s',shapes.length);
  
  var shape = shapes[0];

}

プレゼンテーションをURLで開き、その1枚目のスライド上のシェイプを配列として取得。

そのシェイプの個数をログ出力するというものです。

配列なので、個々のShapeオブジェクトとして取り出すにはインデックスを指定する必要があって、インデックス0のシェイプを取り出したのが、10行目ということですね。

TextRangeオブジェクトとは

シェイプの文字列を取り出すんだったら、例えば「getText」的なメソッドで文字列を取得するようなことを期待しますね。

でも、残念ながらブッブー!

getTextメソッドは存在しますが、それで取得できるのは、文字列ではないのです。

というのも、シェイプ内のテキストって、純粋に文字列だけでなく、フォントの種類やサイズ、色など、様々な設定項目がありますよね。

なので、それらの情報も持っているオブジェクトとして、まずは取得しなければならないのです。

そのテキストに加えて書式設定情報を持つオブジェクトが、「TextRangeオブジェクト」というわけです。

TextRangeオブジェクトを取得する

お伝えした通り、getTextメソッドシェイプのTextRangeオブジェクトを取得するものです。

Shapeオブジェクト.getText()

それで取得できたTextRangeオブジェクトには、文字列のほか、さまざまな書式設定の情報を持っています。

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

では、そのTextRangeオブジェクトから文字列を取り出すにはどうすればよいでしょうか?

そのためのメソッドが、TextRangeオブジェクトのasStringメソッドです。

TextRangeオブジェクト.asString()

シェイプからテキストの文字列を取り出すスクリプト

では、実際にコードを使って、シェイプからテキストの文字列を取り出してみましょう。

以下のようなスクリプトです。

function myFunction() {
  
  var url ='*****テンプレート用プレゼンテーションのURL*****';
  var presentation = SlidesApp.openByUrl(url);  
  var slide = presentation.getSlides()[0];
  var shapes = slide.getShapes();

  for (var i = 0; i < shapes.length; i++){
    var shape = slide.getShapes()[i];  
    Logger.log('シェイプ内の文字列: %s',shape.getText().asString());
  }

}

実行すると、以下のようなログ出力が得られました。

シェイプ内の文字列をログ出力

2つのシェイプがあってわかりづらい感じではありますが、実際のスライドでは以下のような対比になっています。

スライドとシェイプの対比

余談ですが、ページ番号はShapeオブジェクトからは取得できないんですかね(未確認)。

まとめ

以上、GASでGoogleスライドのテキストボックスの文字列を取得する方法をお伝えしました。

ポイントとしては以下のとおりです。

  • シェイプのgetTextメソッドで取得できるのはテキスト+書式設定などの情報を持つTextRangeオブジェクト
  • TextRangeオブジェクトから文字列を取得するのはasStringメソッド

次回は、オブジェクトIDについて解説します。

どうぞお楽しみに!

連載目次:GASでGoogleスライドのプレゼンテーションを楽々作成

定例会議用資料、レポート、プレゼンテーションなど、テンプレートをもとにGoogleスライドのプレゼンテーションを作るというお仕事はけっこうあります。全部は無理にしても、いくつかの段取りは、GASを使って自動化できるかも…!?このシリーズでは、そのようなGoogleスライドのプレゼンテーション自動化のアイデアと、スクリプトの書き方を紹介します!
  1. GASでGoogleスライドのプレゼンテーションを操作するはじめの一歩
  2. GASでGoogleスライドを操作するSlidesサービスの基礎の基礎
  3. GASでGoogleスライドのSlideオブジェクトの概要とその取得方法

「進撃のMicrosoft」からノンプログラマーのこれからを考える

$
0
0

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

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

さて、2020年の一発目の定例会のテーマは「進撃のMicrosoft」

「Excelのような関数とPowerPointのような操作だけで、コーディングすることなくアプリケーションが開発できてしまうサービス」と表現されるアプリ開発環境「Power Apps」。

アプリ連携サービス「Microsoft Flow」に、RPA機能が追加されて生まれ変わった「Power Automate」。

…といった具合に、Microsoftによるノーコード・ローコード開発環境についての動きが活発になってきました。

そんな中、ノンプログラマーとしてはどのように学ぶべき技術を見極めて取捨選択すればよいのか…気になりますよね。

今回は、これらMicrosoftのPowerPlatformのサービスを中心に学びましたので、そのレポートをしていきます!

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

ノンプロ研定例会Vol.27「『進撃のMicrosoft』これからのオフィスツールと働き方について考える」
、Microsoftによる、ノーコード・ローコード開発環境についての動きが活発になってきました。ノンプログラマーとしては、そのような動きも踏まえて、学ぶ技術を取捨選択する必要があります。今回は、M..

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

進撃のMicrosoft

まず、トップバッターはノンプロ研の情シスといえばこの方。ビッグサン(おおやまゆういち) さん

Office 365だけでなく、G Suite、Box、Chatworkとありとあらゆるサービスを吟味して、社員のみなさんの「働く」のためにIT環境を整えていらっしゃいます。

そんな情シス目線で、昨今のMicrosoftについてずばり「進撃のMicrosoft」というタイトルでお話いただきました。

Microsoftの歴史と最近

MicrosoftといえばWindows。

そのデスクトップでのOSシェアはなんと87.9%とのこと。

そして、さらに最近では

  • Windows10への無償アップグレード
  • Office 365のサブスク化
  • GitHubの買収

など、その攻め手を緩めることがない進撃っぷり。

そして、さらに昨年から「PowerPlatform」が大きく取り上げられるようになってきました。

そして、Power Platformでは、マルチクライアント型アプリが作れる「Power Apps」、アプリどうし連携させることができる「Power Automate」など、ノーコード・ローコードで色々なことができる環境が提供されます。

こんな感じです。

それにより「市民開発者」を増やしていく…Microsoftには、そんな狙いがあります。

ノンプログラマーにとってチャンスでもあり、VBAユーザーにとってはピンチでもありそうな…そんなふうに感じます。

Power Platformが使えるOffice365のプランとコスト

情シス担当としては、自社のプランでPower Platformが使えるのか、またその使いどころとコストが気になるところ…

で、いろいろ調べてくださった結果、ローカルでOfficeが使えてかつPower Platform(の一部)が使えるのは以下の3つが主となるよう。

  • Office 365 Business Premium(¥1,360/月)
  • Office 365 E3(¥2,170/月)
  • Office 365 E5(¥3,810/月)

(PowerBIを使うならE5一択だそうです。)

しかし、まぁ正直Office365のプラン…わかりづらい。

情シス的には、プランを変えるとなると社内で説明する必要があるため慎重にならざるを得ない一方で、Microsoftは「進撃」なので、その動きは無視できない…そんな狭間といった具合のようでした。

少なくとも、弊社もOffice 365 Soloなのでやるからにはプランを変えなければなりませぬ…

今年注目のMicrosoftのサービス

続いて、Microsoft MVPを受賞し続けていらっしゃるハイパー総務担当のきぬあささん

ちょうど一年ぶりのゲスト登壇ですね…ありがとうございます!

今年注目のMicrosoftのサービスとして「Power Automate」を中心に紹介いただきました!

Power Automateとは

Power Autometeとは、さまざまなアプリやサービスを連携させて「フロー」を作成することができる、タスク自動化サービスです。

新しめの言葉で「IPaas(Integration Platform As A Service)」などとも言われる、IFTTTやZapierなどと同様のサービスです。

連携できるサービスは「コネクタ」といい、現時点で全部で300以上あります。

OfficeなどのMicrosoftのサービスはもちろん、Googleの各種サービス、Box、Twitter、Slack、Instagram、kintone、その他APIが公開されているさまざまなサービスが接続可能です。

PowerAutomateを使用するには、前述のOffice 365のプランに加えて、以下が必要となります。

  • ユーザー/月ごとに$15
  • 1ヶ月あたり5フローを無制限ユーザーで使用可能 $500/月 + フロー数に応じて

さらに、コネクタによっては「プレミアムコネクタ」ということで、別料金です。

ちょいちょいかかりますね。

UI Flowとは

それで、なりもの入りでそのラインナップに追加されたコネクタ「UI Flow」

これが注目のやつです。

なにせ、例えばAPIに対応していないレガシーなシステムの操作を、記録→編集→再生実行できる…つまり話題のRPA機能がコネクタとして追加されたものなのです。

UI Flowは現時点では、プレビュー版ということで、機能も限定的です。

今後、本番運用されるときに価格も決まるでしょうとのこと。

コミュニティプランと開発者プログラム

あれこれお金がかかっちゃいそうですが、学習用、開発者用であれば、無償で使えるプランがあるとのこと、教えていただきましたよ!

コミュニティプラン

Power Apps、Power Automateなどを学習用途で無料で使用可能。

以下参考ページです。

PowerAppsを今から始める人は必見!期間制限なしの完全無償プラン「PowerApps Community Plan」のサインアップ方法 - 吉田の備忘録
PowerAppsを試してみたいという方には完全無償・無期限のプラン「PowerApps Community Plan」が用意されています。 また、良いニュースが2018年8月15日の公式ブログ投稿(英語)で発表され、こ …

Office 365 開発者プログラム

Microsoft 365 E5 開発者向けサブスクリプションを90日間無料で利用可能(開発活動継続で自動更新)。

こちらも要チェックです…!

ホーム - 開発者プログラム

まとめ

ということで、進撃のMicrosoft、そしてPower Platform…まったく無視はできないですね。

そして今後の展開が楽しみであります!

ただ、プランや始め方がわかりづらいという部分があり、今回お二方にいろいろと教えていただいてたいへん助かりました。

私も、なるべく早い段階でキャッチアップして、みなさんが触れて吟味するのが楽になるように、サポートできればと思いました。

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

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


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>