Translate

Post Date:2021年3月6日 

Googleフォームの選択肢をシートのデータで更新する

ゾウでもわかる Google Apps Script

GAS(Google Apps Script)で Googleフォームのプルダウン、チェックボックス、ラジオボタンの選択肢をスプレッドシートの値で更新する方法についての説明です。

同じフォームを長く使っていて、時々フォーム上の選択肢を更新するような場合には、シート上で選択肢の値が管理できるようになるので便利です。

このサンプルコードでできることは、

  • シート上の値で選択肢の内容を更新
  • プルダウン、チェックボックス、ラジオボタンに対応
  • 更新できるの質問は1個(質問番号を指定)

です。


フォームとシートの作成(準備)

プルダウン、チェックボックス、ラジオボタンの選択肢の更新をするので、下記の3つの質問を作成します。選択肢はスプレッドシートから更新するので設定不要です。

  1. 商品名(プルダウン)
  2. 商品名(チェックボックス)
  3. 商品名(ラジオボタン)
Googleフォームのサンプル

次に選択肢をシートで管理するために、シートのA列1行目にタイトルを入れて、2行目からデータを入れます。

Googleスプレッドシート上の選択肢

これで準備は完了です。

次からがGoogle Apps Scriptの例になります。


プルダウンの選択肢を更新する

質問番号を指定して質問の選択肢を更新するという簡単なサンプルです。このサンプルコードはプルダウンの質問項目の選択肢用なので、指定した質問番号がチェックボックス、ラジオボタンの場合にはエラーとなります。

上記フォーム例では、プルダウンは1番目の質問です。

下記サンプルコードをスクリプトエディタのコードに貼り付けてください。

function updateFormList() {
  //フォームの質問番号
  var questionNo = 1
  //フォームID
  var formId  = '1234567890abcdefghijklmnopqrstuvwxyz'
  //シートID
  var sheetId = 'zyxwvutsrqponmlkjihgfedcba0987654321'
  //シート名
  var sheetName = 'List'
  //データ配置列名
  var colName = 'A'
  //データ開始行
  var rowNum = 2
 
  //フォームの取得
  var form = FormApp.openById(formId)
  //全質問項目を取得
  var items = form.getItems()
  //questionNoで指定した質問項目を指定(配列は0から始まるので-1)
  var item = items[questionNo-1]

  //スプレッドシートを取得
  var sheet = SpreadsheetApp.openById(sheetId).getSheetByName(sheetName)
  //シートの最終行を取得
  var lastRow = sheet.getLastRow()

  //リスト内容の取得
  var arrList = sheet.getRange(colName + rowNum + ':' + colName + lastRow).getValues()

  //選択肢をフォームに反映
  item.asListItem().setChoiceValues(arrList)
}

フォームの質問番号

更新する質問番号を3行目の変数(questionNo)に代入します。上記のGoogleフォームの例ではプルダウンの質問は1番目なので1を指定します。

 2.  //更新するフォームの質問番号
 3.  var questionNo = 1

実際には配列として取得されるので1番目の質問項目は、配列の0番目となるので、16行目で questionNo-1 としています。

19.  //questionNoで指定した質問項目を指定(配列は0から始まるので-1)
20.  var item = items[questionNo-1]

フォームIDとシートID

GoogleフォームとGoogleスプレッドシートは、IDで取得しています。

フォームIDについては、象と散歩: GASでGoogleフォームの値を取得する(フォームを指定) でも説明していますが、再掲となります。

Googleフォームの編集URLが下記の場合、フォームIDは、赤字の部分です。

https://docs.google.com/forms/d/1234567890abcdefghijklmnopqrstuvwxyz/edit

シートIDも同様でに赤字の部分となります。

https://docs.google.com/spreadsheets/d/zyxwvutsrqponmlkjihgfedcba0987654321/edit

5行目にシートIDを7行目にシートIDを指定していますが、作成したフォームとスプレッドシートのURLを確認して書き換えてください。

 4.  //フォームID
 5.  var formId = ‘1234567890abcdefghijklmnopqrstuvwxyz'
 6.  //シートID
 7.  var sheetId = 'zyxwvutsrqponmlkjihgfedcba0987654321'

シート名

9行目にスプレッドシートのシート名を指定します。今回のサンプルではシート名をListとしています。

 8.  // シート名
 9.  var sheetName = 'List'

データ開始位置

10-13行目でシートのデータ開始を指定します。例ではA列2行目からが選択肢のデータとなりますので、11行目の colName にAを、13行目の rowNum に2を指定します。

10.  //データ配置列名
11.  var colName = 'A'
12.  //データ開始行
13.  var rowNum = 2

プルダウン選択肢の更新

28行目で、指定したデータ開始位置(A列2行目)からデータがある最終行までを arrList に格納しています。

シート上の 商品A, 商品B, 商品C が、

arrList[0]    商品A
arrList[1]    商品B
arrList[2]    商品C

として格納されます。

そして、31行目で、この配列の値でフォームの質問番号に該当する質問の選択肢(プルダウン)を更新しています。

30. //選択肢を更新する
31. item.asListItem().setChoiceValues(arrList)

asListItem() はプルダウン項目用なので questionNo で指定した質問がプルダウンでない場合にはエラーとなるので注意してください。item.getType() で質問のタイプを確認することができます。プルダウンの質問のタイプは LIST です。

updateFormList を実行します。

スクリプトエディタから実行

ログには実行完了とだけ表示されますが、フォームを参照すると、

Googleフォーム プルダウン形式

シート上のデータでプルダウンの選択肢が更新されています。


チェックボックスの選択肢を更新する

スプレッドシート上にある選択肢を配列に入れて、フォームの選択肢を更新する処理は基本的には同じです。プラダウンのサンプルを実行されたのであれば変更箇所は2箇所だけです。


フォームの質問番号

更新する質問番号を3行目の変数(questionNo)に代入しますが、上記のGoogleフォームの例ではチェックボッククスの質問は2番目なので2を指定します。

 2.  //更新するフォームの質問番号
 3.  var questionNo = 2

チェックボックス選択肢の更新

31行目をチェックボックス項目用の asCheckboxItem() に変更します。またチェックボックスは、選択肢に「その他」を設定できますが、showOtherOption() でその他の有無を指定します。

  • showOtherOption(true)    その他 あり
  • showOtherOption(false)   その他 なし

その他の選択肢を追加する場合の例となります。

30. //選択肢を更新する
31. item.asCheckboxItem( ).setChoiceValues(arrList).showOtherOption(true)

updateFormList を実行すると、商品A ,B,C と その他の選択肢が追加されます。

Googleフォーム チェックボックス形式

チェックボックスを更新するコード全体はこちらです。

function updateFormList() {
  //フォームの質問番号
  var questionNo = 2
  //フォームID
  var formId  = '1234567890abcdefghijklmnopqrstuvwxyz'
  //シートID
  var sheetId = 'zyxwvutsrqponmlkjihgfedcba0987654321'
  //シート名
  var sheetName = 'List'
  //データ配置列名
  var colName = 'A'
  //データ開始行
  var rowNum = 2
 
  //フォームの取得
  var form = FormApp.openById(formId)
  //全質問項目を取得
  var items = form.getItems()
  //questionNoで指定した質問項目を指定(配列は0から始まるので-1)
  var item = items[questionNo-1]

  //スプレッドシートを取得
  var sheet = SpreadsheetApp.openById(sheetId).getSheetByName(sheetName);
  //シートの最終行を取得
  var lastRow = sheet.getLastRow()

  //リスト内容の取得
  var arrList = sheet.getRange(colName + rowNum + ':' + colName + lastRow).getValues()

  //選択肢をフォームに反映
  item.asCheckboxItem( ).setChoiceValues(arrList).showOtherOption(true)
}

ラジオボックスの選択肢を更新する

続いて、ラジオボックの場合となります。こちらも変更箇所は2箇所だけです。


フォームの質問番号

ラジオボックスの質問は3番目なので questionNo に を代入します。

 2.  //更新するフォームの質問番号
 3.  var questionNo = 3

ラジオボックス選択肢の更新

35行目をラジオボックス用の asMultipleChoiceItem() に変更します。今回は、「その他」の選択肢を付けない showOtherOption(false) とします。

30. //選択肢を更新する
31. item.asMultipleChoiceItem().setChoiceValues(arrList).showOtherOption(false)

updateFormList を実行すると、商品A ,B,C がラジオボックの選択肢として追加されます。

Googleフォーム ラジオボタン形式

ラジオボックスを更新するコード全体はこちらです。

function updateFormList() {
  //フォームの質問番号
  var questionNo = 3
  //フォームID
  var formId  = '1234567890abcdefghijklmnopqrstuvwxyz'
  //シートID
  var sheetId = 'zyxwvutsrqponmlkjihgfedcba0987654321'
  //シート名
  var sheetName = 'List'
  //データ配置列名
  var colName = 'A'
  //データ開始行
  var rowNum = 2
 
  //フォームの取得
  var form = FormApp.openById(formId)
  //全質問項目を取得
  var items = form.getItems()
  //questionNoで指定した質問項目を指定(配列は0から始まるので-1)
  var item = items[questionNo-1]

  //スプレッドシートを取得
  var sheet = SpreadsheetApp.openById(sheetId).getSheetByName(sheetName)
  //シートの最終行を取得
  var lastRow = sheet.getLastRow()

  //リスト内容の取得
  var arrList = sheet.getRange(colName + rowNum + ':' + colName + lastRow).getValues()

  //選択肢を更新する
  item.asMultipleChoiceItem().setChoiceValues(arrList).showOtherOption(false)
}

更新する質問のタイプを確認しよう(22.2.11追記)

何件かご質問もいただきましたが、上記のサンプルで実行エラーとなる場合の多くは、質問番号で指定した番号の質問タイプと利用するメソッドが違う場合です。

下記のエラーが出力される場合が、

エラー Exception: Invalid conversion for item type: XXXXX

更新しようとする質問のタイプとメソッドが一致していない場合に出力されるエラーで、type:XXXX には、指定した質問のタイプが表示されます。

Gooleフォームで設問に指定できる項目とタイプについて下表にまとめています。

質問項目タイプ更新に利用するメソッド
プルダウンLISTasListItem()
チェックボックスCHECKBOXasCheckboxItem()
ラジオボタンMULTIPLE_CHOICEasListItem()
記述式TEXT-
段落PARAGRAPH_TEXT-
ファイルのアップロードFILE_UPLOAD-
均等メモリSCALE-
選択式(グリッド)GRID-
チェックボックス(グリッド)CHECKBOX_GRID-
日付DATE-
時刻TIME-
セクションPAGE_BREAK-
タイトルSECTION_HEADER-
画像IMAGE-
動画VIDEO-

セクション、写真、動画なども質問となるので指定する番号に注意してください。


質問タイプを確認するコード

Loggerで指定した質問番号のタイプをログに出力するコードを追加してみてください。

19. //questionNoで指定した質問項目を指定(配列は0から始まるので-1)
20. var item = items[questionNo-1]

下記のコードを21行目以降に追加します。

  Logger.log('質問総数:' + items.length)
  Logger.log('質問番号:' + questionNo)
  Logger.log('タイトル:' + item.getTitle())
  Logger.log('タイプ:' + item.getType())

下記のように、質問総数、指定した質問番号(questionNo)、質問のタイトル、タイプが出力されます。

情報 質問総数:3
情報 質問番号:1
情報 タイトル:商品名(プルダウン)
情報 タイプ:LIST

下記は、更新はせずに、指定した質問番号のタイプを確認するサンプルコードです。

function updateFormList() {
  //フォームの質問番号
  var questionNo = 1
  //フォームID
  var formId  = '1234567890abcdefghijklmnopqrstuvwxyz'
 
  //フォームの取得
  var form = FormApp.openById(formId)
  //全質問項目を取得
  var items = form.getItems()
  //questionNoで指定した質問項目を指定(配列は0から始まるので-1)
  var item = items[questionNo-1]

  Logger.log('質問総数:' + items.length)
  Logger.log('質問番号:' + questionNo)
  Logger.log('タイトル:' + item.getTitle())
  Logger.log('タイプ:' + item.getType())
}

スプレッドシートのメニューから実行する

下記のコードを追加すると、スプレッドシートを開いたときに、メニューに "Form選択肢更新" が追加されます。

スプレッドシートのメニューに追加

”商品名更新” を選択すると updateFormList() がスクリプト エディタを開かなくても実行できます。

function onOpen(){ 
  SpreadsheetApp
    .getActiveSpreadsheet()
    .addMenu('Form選択肢更新', [
      {name: '商品名更新', functionName: 'updateFormList'},
    ]);
}

GASの基礎を学べる参考図書

ある程度プログラミンがわかっていれば、WEBやYoutubeでも十分に調べられると思いますが、初歩的なところからであれば参考図書は有効な学習手段です。

詳解! Google Apps Script完全入門 [第3版]」は、プラグラミング初心者にわかりやすく説明されています。GASを最初に学ぶ一冊として良書です。

Udemy オススメ講座

【新IDE対応】Google Apps Script(GAS)の基礎を完全習得

【新IDE対応】Google Apps Script(GAS)の基礎を完全習得

講師:事務職たらこ

印象に残りやすい手書き風スライドを用いGASの基本的なプログラミングを気軽に学ぶことができる。本講座でGASを活用した自動化ができるレベルにはなれないが、基礎としては十分。

Post Date:2021年2月18日 

小型ミラーレスカメラの魅力

Pentax Q10 ダブルズームキット

「カメラを手にしたのはいつですか?」

写真を趣味としていなければ、昔、買ったデジカメはあるけど、最近はスマホでしか写真を撮っていないという方が多いのでないでしょうか?

写メという言葉があったときは、カメラで撮った写真と携帯で撮った写真は明確に別として分類されていましたが、いまや日常の中では 写真=スマホ です。

データからみてもデジカメ市場は瀕死の状態です。

下図は、一般社団法人 カメラ映像機器工業会の統計データから国内出荷台数をグラフにしたものですが、スマホのカメラの性能向上に反比例してデジカメの需要は衰退しています。

2020年の国内デジカメ出荷台数は、はコロナの影響もあってか、ピーク時の1/10程度となり、20年前より少なくなっています。

デジカメ国内出荷台数

それでも趣味としてカメラを楽しんでいる人もいるので、専門的なカメラ(一眼レフ)の需要は一定度はあるのではないかと思い、レンズ交換式カメラに絞ってグラフ化してみましたが、

一眼レフの国内出荷台数も2013年をピークに下落していました、、、。

一眼レフ・ミラーレス国内出荷台数

そんな需要が落ち込むデジカメ市場の中で健闘しているのがミラーレスカメラです。

2020年はピーク時の4割程度となっていますが、2018年に一眼レフの出荷台数を追い越しています。


ミラーレスカメラとは

一眼レフカメラでは、レンズを通した画像をカメラの中にあるミラー(鏡)で反射させ、ファインダーで被写体を確認することができます。

ミラーレスカメラは、この光学ファインダーで被写体を確認できる機構がなく、電子的な画像を液晶モニターで確認します。光学ファインダーで視るための反射させる鏡がカメラの中にないからミラーレスです。

ミラーレスカメラの特徴は

  • 軽量・小型
  • 一眼レフより安価
  • レンズを交換できる

と、手軽にカメラで撮る楽しみが味わえます。


小型ミラーレスカメラ

Pntax Qシリーズは、「小型・軽量」「レンズを交換できる」といったミラーレスの特徴を最大限に生かしたカメラです。2011年に初代が発売され、その後、ミラーレス全盛期の2012年から2014年にQ10からQS-1へと変遷していきました。

とても小さく、片手に乗るサイズで、手軽に持ち歩けるカメラです。レトロなデザインとカラーバリエーションは年代性別を問いません。

Pentax Q サイズ 重量 発売年
Q10 3.35 x 10.2 x 5.8 cm 180g 2012年
Q7 3.35 x 10.2 x 5.8 cm 180g 2013年
QS-1 3.40 x 10.5 x 5.8 cm 203g 2014年

随分と前に、標準ズーム/望遠ズームがセットになっていたQ10ダブルズームキットを購入しましたが、未だに中古はもちろんのこと、新品も出回っているのに驚きです。

Qシリーズは専用(小型)レンズが豊富にあり現在でも販売されています。一眼レフのレンズのように高価ではないので、レンズを交換するという楽しみ方もできます。

座敷箒(短柄) レンズタイプ レンズの説明
01 STANDARD PRIME 標準単焦点 人の自然な視野に近い画角で、風景撮影やポートレートなど、様々な被写体に適したレンズ
02 STANDARD ZOOM 標準ズーム 広角から中望遠域をカバーする使いやすい標準ズームレンズ
03 FISH-EYE フィッシュアイ 人間の視覚を超えたワイドな画角、遠近感を強調した立体感のある写真効果を演出
04 TOY LENS WIDE 広角単焦点 まるでトイカメラで撮影したような柔らかな味わいの描写を手軽に楽しむことができる広角レンズ
05 TOY LENS TELEPHOTO 望遠単焦点 望遠レンズにして、まるでトイカメラで撮影したような写真効果が得られるレンズ
06 TELEPHOTO ZOOM 望遠ズーム スポーツや風景など対象と距離のある場合に適した望遠ズームレンズ
07 MOUNT SHIELD LENS 標準単焦点 ボディキャップの感覚で使用できる薄型コンパクトレンズで、トイカメラで撮影したような写真効果が得られる
08 WIDE ZOOM 超広角ズーム 被写体まで距離のとれない狭い空間や、広大で遠近感を強調した風景写真などが撮れる広角ズームレンズ(生産終了

自分なりの写真を

カメラの知識もまるでないのに望遠レンズで使いたいという理由でQ10を購入しましたが、色々とイジっていると、

  • F値(絞り)
  • シャッター速度
  • ISO感度

の値を変更することによってボケブレができ、味わいのある写真が撮れるということが素人なりに理解できました。

望遠レンズで、F値を小さくする(絞りを開く)と、ピントが合う範囲が狭くなり、被写体にピントを合わせると、それ以外がボケてそれっぽい写真が撮れます。

望遠ズームでF値を下げて撮影

またシャッタースピードを遅くして撮ったブレのある写真も味わいがあります。

望遠ズームでシャッター速度を落として撮影

レンズは、ダブルズームキットに04を追加した下記の3種類のレンズを使っていましたが、値段がとっても可愛いかったので 07を購入してみました。

  • 02 STANDARD ZOOM(標準ズーム)
  • 04 TOY LENS WIDE(広角単焦点)
  • 06 TELEPHOTO ZOOM(望遠レンズ)
  • 07 MOUNT SHIELD LENS(標準単焦点)

マウントシールドレンズは、「これレンズなの?」という薄さで、レンズもピンホールのようです。しかし、このレンズで撮った写真のチープ感は素敵です。

Pentax Q10 / 07 MOUNT SHIELD LENS

片付けなきゃと思いながら何気なく撮った部屋の写真ですが、焦点範囲が狭いのでいい感じに周りをボカしてくれます。

07 MOUNT SHIELD LENS で撮影した部屋

Q10ダブルズームキットを購入したので、普段は標準ズーム(02)を装着していますが、いまさらながら標準レンズの 01 STANDARD PRIME が欲しくなってしまいました、、、。


オススメのミラーレスカメラ

普段から持ち歩くことを考えると型落ちモデルの小型ミラーレスカメラが価格的にもオススメです。

Q10の性能で十分にカメラを楽しめていますので、Q10という選択肢もありかとは思いますが、Q10を使っていて不便なのは、撮った写真を直ぐに共有できないことです。

いまの時代、日常使いのカメラとするのであれば、Bluetoothなど無線でスマホと連携できる機能は必須です。あとは見た目の可愛さですかね。

メーカー 型落ちモデル
OLYMPUS PEN E-PL9
Cannon EOS M100
FUJI FILM X-A5
Panasonic DC-GF9

スマホで写真を撮って加工する時代だからこそ、カメラが持つ本来の光の調節機能を活かしたボケブレは写真を撮る楽しみを教えてくれます。

ステイホームの中、カメラの使い方を学ぶのも悪い時間の過ごし方ではありません。

Post Date:2021年2月12日 

GoogleスプレッドシートでグラフをWEBに公開する方法

ゾウでもわかるGoogleスプレッドシート

Googleスプレッドシートで作成したグラフは、画像としてダウンロードしなくても、そのままブログやサイトに掲載できるということに最近気が付きました。


Googleスプレッドシートのグラフ公開手順

手順はとても簡単です。

  1. 作成したグラフをクリック
  2. グラフ右上に表示される「」(縦三点リーダー)をクリック
  3. グラフを公開 を選択
Googleスプレッドシートで作成した円グラフ

「グラフの公開」を選択すると「ウェブに公開」というページに遷移しますので「公開」をクリックします。

Googleスプレッドシート「ウェブに公開」

埋め込むタブを選択するとhtmlコード(iframe)が表示されます。

埋め込みコードの取得

グラフは、インタラクティブ画像を選択ができます。インタラクティブを選ぶとグラフにマウスポインタを合わせるとポイントしたグラフの値が表示されます。

下記はバーチャートの表示例です。

Googleスプレッドシートのグラフを直接参照しているので、スプレッドシートでグラフが参照しているデータやグラフを変更すると公開しているグラフも連動して変更されます。またスプレッドシートを削除してしまうと表示されなくなってしまいます。


スマホの表示が崩れる

取得した埋め込みコードのままだと、グラフのサイズによってはスマホの表示が崩れてしまいます。

スタイルシートで調整しようとしましたが挫折しました。コード上のwidth(横幅) と height(高さ)を適宜調整してください。

無知は罪なりでした、、、、。

象と散歩:人気の投稿(過去7日間)