【GAS学習04】フォームの質問の選択肢をスプレッドシートから生成する

こんにちは。

めいめいです。

前回はタカハシさんのブログを読み込みながら、

をして、
GASでフォームを作成することができました。

タカハシさんのブログの連載記事で、
スプレッドシートから設問項目を読み込みする方法が記載されていたので
そちらをもとに、
GASでGoogleフォームを作成してみました。

作成にあたっては色々と乗り越えなければいけない壁が多く…
タカハシさんのブログを読み込みながら、GASの復習もできました。

参考にさせていただいた記事はこちらです。

tonari-it.com

手順としては以下です。

  1. スプレッドシートで選択肢の項目を列挙する
  2. スプレッドシートに列挙した項目を取得して(この時点では2次元配列)一次元配列にする
  3. [2]の一次元配列を、項目の選択肢としてセットする

こうやって復習がてらに記述すると、
思考が整理されるのですが、
記事を一読しただけではチンプンカンプンでした。
プログラミングって文字情報だけで吸収しようとしたり、身につけるの難しいですね涙

恥じらいもなく、
タカハシさんのやり方マルコピですが、
どのようにやったかを記録します。

1. スプレッドシートで選択肢の項目を列挙する

2. スプレッドシートに列挙した項目を取得して(この時点では2次元配列)一次元配列にする
function myFunction_questionlists() {

  const ss = SpreadsheetApp.getActiveSpreadsheet()
  const answerchoices = ss.getSheetByName('質問項目').getDataRange().getValues();

  //shift:先頭要素を削除する
  answerchoices.shift();

  //二次元配列と、列数を渡すことで、その列のデータを一次元配列に格納する
  //mapメソッド:二次元配列に含まれる要素から、特定のインデックスを取り出して、一次元配列を生成する
  //filterメソッド:対象の配列のすべての要素のうち条件式がtrueの要素だけで新たな配列を生成するので、空文字の要素は取り除かれる
  console.log(answerchoices.map(record => record[2]).filter(value => value));   // [ 'GAS', 'Python', 'VBA' ]

}

タカハシさんのブログのソースコードを解読。 めっちゃ勉強になりますが、いきなり関数を組めないので、mapとかfilterとか試しながらconsole.logで出力させつつ、項目行だけ取り出すことに成功。

こちらを関数化する…。 アロー関数も使ってーの、のでなんとかできたかな…? っていうかタカハシさんのコード、ほぼ一緒ですが…。

function generateArray(values, column) {
  return values.map(record => record[column]).filter(value => value);
}
3. [2]の一次元配列を、項目の選択肢としてセットする

function createEventForm05(){
 
  const ss = SpreadsheetApp.getActiveSpreadsheet()
  const values = ss.getSheetByName('シート1').getDataRange().getValues();
  const formTitle = values[0][1]; //タイトル
  const formDescription = values[1][1]; //説明文

  const questiondataValues = ss.getSheetByName('質問項目').getDataRange().getValues();
  questiondataValues.shift()

  const form = FormApp.create(formTitle);

  const id = PropertiesService.getScriptProperties().getProperty('Folder_ID');
  const formFile = DriveApp.getFileById(form.getId());
  DriveApp.getFolderById(id).addFile(formFile);
  DriveApp.getRootFolder().removeFile(formFile);


  form.setDescription(formDescription);

  //1問目
  form.addTextItem().setTitle('氏名').setRequired(true);

  //2問目
  //まずvalidationbuilderオブジェクトを作る
  const validationEmail = FormApp.createTextValidation().requireTextIsEmail().build();
  form.addTextItem().setTitle('メールアドレス').setRequired(true).setValidation(validationEmail);

  //3問目
  form.addTextItem().setTitle('所属組織').setRequired(true);

  //4問目
  form.addCheckboxItem()
    .setTitle('参加日程をお選びください')
    .setChoiceValues(['1日目','2日目','3日目'])
    .setRequired(true);


  //5問目
  form.addMultipleChoiceItem()
    .setTitle('食事制限')
    .setChoiceValues(['なし','ベジタリアン','ビーガン','コーシャ','グルテンフリー'])
    .showOtherOption(true)
    .setRequired(true);

 
  //6問目
  form.addListItem()
    .setTitle('お住まいはどちらですか')
    .setChoiceValues(generateArray(questiondataValues,0))
    .setRequired(true);

}


//↓スプレッドシートから質問項目を抽出するための関数
function generateArray(values, column) {
  return values.map(record => record[column]).filter(value => value);
}


そしたらなんとかできました!

自分のメモとしてしか機能しなさそうな記事ですが…。 なんとか読解&自分のGASで走らせることができてよかったです><

もっと勉強します・・・!

【GAS学習03】フォームに自由記述、チェックボックス、ラジオボタンの設問を追加する

こんにちは。

めいめいです。

前回は

  • フォームを作成する

  • 作成したフォームを指定のフォルダに入れる

ところまでなんとかできました!!

また、タカハシさんのブログやWeb上に先人たちが上げてくださっているコードを勉強しながら、フォームの作成を進めて行きたいと思います。

今日はフォームに、質問項目を5つ追加してみたいと思います。

  1. お名前 (必須・自由記述)
  2. メールアドレス(必須・自由記述)
  3. 所属組織(必須・自由記述)
  4. 参加日 (必須・チェックリスト)
  5. 食事制限(必須・ラジオボタン

参考にさせていただいた記事はこの4つです。

tonari-it.com

tonari-it.com

tonari-it.com

tonari-it.com

Validationが難しかったのですが、、サンプルコードをコピペして使わせていただきました。 なんとかできたかな…?

function createEventForm02(){
 
  const ss = SpreadsheetApp.getActiveSpreadsheet()
  const values = ss.getSheetByName('シート1').getDataRange().getValues();
  const formTitle = values[0][1]; //タイトル
  const formDescription = values[1][1]; //説明文

  const form = FormApp.create(formTitle);

  const id = PropertiesService.getScriptProperties().getProperty('Folder_ID');
  const formFile = DriveApp.getFileById(form.getId());
  DriveApp.getFolderById(id).addFile(formFile);
  DriveApp.getRootFolder().removeFile(formFile);

  form.setDescription(formDescription);
  //1問目
  form.addTextItem().setTitle('氏名').setRequired(true);

  //2問目
  //まずvalidationbuilderオブジェクトを作る
  const validationEmail = FormApp.createTextValidation().requireTextIsEmail().build();
  form.addTextItem().setTitle('メールアドレス').setRequired(true).setValidation(validationEmail);

  //3問目
  form.addTextItem().setTitle('所属組織').setRequired(true);

  //4問目
  form.addCheckboxItem()
    .setTitle('参加日程をお選びください')
    .setChoiceValues(['1日目','2日目','3日目'])
    .setRequired(true);


  //5問目
  form.addMultipleChoiceItem()
    .setTitle('食事制限')
    .setChoiceValues(['なし','ベジタリアン','ビーガン','コーシャ','グルテンフリー'])
    .showOtherOption(true)
    .setRequired(true);

}

チェックボックスラジオボタンも理解できた!

なので、もっとスマートに、スプレッドシートから設問項目を読み込めるようにしたいなぁ…。

配列の扱いが苦手なので、億劫になってしまうのだけど、 タカハシさんのブログで記事にしてくださっているので、 これでまた学習したいと思います。

【GAS学習02】GASで作成したフォームを、指定のフォルダに移動する

こんにちは。

めいめいです。

前回はGASでフォームを作成しましたが、
マイドライブへ追加されているのをなんとかしたいと思いました。

今回はタカハシさんのブログを参考に、
指定のフォルダへ移動するスクリプトを理解して書きたいと思います。

こちらの記事を読み込みました↓

tonari-it.com

が…

プロパティストアを使わなくてはいけないらしく、
なんだっけ…となってしまったので
再度学習したいと思います。

プロパティストアとは

プロジェクトやドキュメントに紐づく形でデータを格納しておくことができる格納領域のこと。

プロパティストアには文字列形式のキーと値のペアを格納することができ、スクリプトから読み書きできる。

例えば、スクリプト内で使用するファイルIDやメールアドレス等コードをコピーして再利用する際に流出してしまう心配がある。

そんなときにプロパティストアを使うと、データをコードから分離して管理することができる

を参照しました。

ではどうやってセットするのかというと… こちらを参照してセット&取り出しができました。

tonari-it.com

function setScriptProperty() {
  PropertiesService.getScriptProperties().setProperty('Folder_ID', 'フォルダーIDを入力する');
}

<説明>

  • スクリプトプロパティを取得するgetScriptPropertiesメソッドを使用して、スクリプトプロパティを取得

  • setPropetiesメソッドを使用して、プロパティストアに、指定されたkeyと値valueのペアを設定

プロパティストア使うのに慣れないので、本当にちゃんと設定されているのかな?と不安だったので、以下のスクリプトで確認もしました^^;

function folderID_toridasu() {
  const folderID = PropertiesService.getScriptProperties().getProperty('Folder_ID')
  console.log(folderID);
}

で、そこで、こちらの記事にあるスクリプトを書き書き…

function createEventForm02(){
 
  const ss = SpreadsheetApp.getActiveSpreadsheet()
  const values = ss.getSheetByName('シート1').getDataRange().getValues();
  const formTitle = values[0][1]; //タイトル
  const formDescription = values[1][1]; //説明文

  const form = FormApp.create(formTitle);

  const id = PropertiesService.getScriptProperties().getProperty('Folder_ID'); //フォルダのIDをプロパティストアから取得
  const formFile = DriveApp.getFileById(form.getId()); //フォームのファイルを取得
  DriveApp.getFolderById(id).addFile(formFile);  //指定のフォルダにファイルを追加
  DriveApp.getRootFolder().removeFile(formFile); //指定のフォルダからファイルを削除

  form.setDescription(formDescription);
  
}

実行したところ、
ちゃんと指定のフォルダに移行することができていました!涙

上のスクリプトを書く中で、 DriveAppも勉強しなきゃ…と思いましたが、力尽きました。

tonari-it.com

こちらの記事で説明されているので、 次に、またしっかり読んでおこうと思います。

【GAS学習01】Googleフォームを作成する

こんにちは。

めいめいです。

今日から業務でよく使用するGoogleフォームについて、
GASでどんなことができるかの学びを深めて行きたいと思います!

お仕事では、しばしば高頻度でGoogleフォームを作成して利用します。
各お客様向けだったり、
各イベントごとにつくったり、
社内のご意見回収用だったり…。

そのたびに、

「新規作成
  > タイトル記入
  > 説明文記入
  > 項目を追加
  >(以下繰り返す)・・・・
  > その後公開設定等あれこれカスタマイズして完成!」

を手動でやっていましたが、
こちらのブログの記事を拝見してあれこれ自動でできるらしい!?
というのを目にしたので試してみたいと思います。

今回の学習の目標として、
このフォームを自動で作成してみたいと思います。(Googleフォームのテンプレートから作成しました)

上記ブログを拝見しまして、コードを記載してみました!

function createEventForm(){
  const form = FormApp.create('イベント参加申込書'); //フォームのタイトル
  form.setDescription('フォームの説明'); //フォームの説明
}

こちらを実行すると、
「マイフォルダ」内にGoogleフォームができました!

コードの説明メモ

  • FormAppオブジェクトのcreateメソッドを使用(戻り値は生成したFormオブジェクト)
  • フォームの説明を設定するには、Formオブジェクトに対してsetDescriptionメソッドを使用

スプレッドシートに記入した情報をもとに、
フォームを作成するのもやってみます。

スプレッドシートを作成して↓

記事に掲載のコードを拝借して、実行してみました。

function createEventForm(){
 
  const ss = SpreadsheetApp.getActiveSpreadsheet()
  const values = ss.getSheetByName('シート1').getDataRange().getValues();
  const formTitle = values[0][1]; //タイトル
  const formDescription = values[1][1]; //説明文

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

実行すると…
「マイフォルダ」内にGoogleフォームができました!

目標とするフォームにはまだまだほど遠いですが、
いままでポチポチと手作業でやっていたものが、
コードを書くだけでできるなんて、とっても便利で楽しいです♡

ただ・・・・
気になるのは「マイドライブ」内にフォームができることです。
スプレッドシートがあるフォルダ内にできるのかな??と思って探してたら見つからず、
続けて実行を押して確かめてたりすると、どんどんマイドライブに溜まっていっちゃうのがなんでだろう…
という疑問です。

参考にさせていただいたブログでは、 続きに、「指定のフォルダに移動する方法」という記事も掲載されていましたので

tonari-it.com

次はその内容を学んでいきたいと思います!!!

ブログを始めたいと思います

こんにちは。

 

めいめいと申します。

 

昨年GASを少し学んでいたのですが、

なかなか実務でも使いこなせておらずでしたので、

ブログで学習記録をつけたいと思います。

 

また、ブログを書く練習も兼ねて、アウトプットしながら学習をしたいと思います。

 

みなさまよろしくお願いいたします。