<Gmail1>メール定型文を下書きへGo!

この記事では、GAS(Google Apps script)で会社などに送る決まった文章をスプレッドシートに入力して、ボタンを押すと押した人のGmailの下書きに追加する方法を掲載しています。

お世話になっているサイトは、いつも隣にITのお仕事さんの

GASでGmailを操作して日々の日報メールの下書きを自動で作成する

です。

得意先の方にいつも同じような文章を送る時、上司に同じような報告を送るといった場合に使えるテクニックです。

この例では、得意先の「株式会社あいうえお」の営業部長のヤマダさんに送る例で作成して行きます。

このようにスプレッドシートを配置します。

シート名はこのようにしました。

このスプレッドシートを二次元配列として取得して、createDraftメソッドを使って「Gmailの下書き」に保存します。

なぜ二次元配列なのかと申しますと、スプレッドシートはExcel、将棋やオセロのような縦横の座標になっているからです。

二次元、すなわち平面の座標を格納する配列です。

メソッドというのは、動作のことです。この例ではGmailの下書きの所に送るという動作です。

「メソッド」というとちょっと分かりづらいという方は、メソッドを数学の公式みたいなものだと捉えて頂いても大体掴めて来ると思います。

例えば3角形の公式に必要なのは「底辺」と「高さ」の値です。この底辺と高さの値が引数に当たり、底辺×高さ÷2で三角形の面積を求めて計算する動作がメソッドに当たります。

createDraftメソッドはこのスプレッドシートのボタンを押した人のGmailの下書きの所に移動させるメソッドです。

引数(メソッドを利用する際に必要となるもの)は「アドレス、タイトル、本文」です。

アドレスをto、タイトルをsubjectという定数、本文をbodyという変数に格納して、このcreateDraftメソッドを使います。

アドレスとタイトルは変わらないので定数、本文はこのプログラムでは何も無い所に「誰々さん」、「お世話になっています・・・」などと追加していくので変数です。

今回の例では、本文が最初何も無い所に「宛名の人名」+「その後の挨拶や文章」が加えられて行きます。

定数も変数もAmazonなどの段ボール箱に例えられ、箱の中に値を入れるイメージですが、定数は箱の中身を接着剤で固定して動かないようにするもの、変数は「魔法の壺」を入れたり、今日私が購入した「光目覚まし時計」を入れたりと、色々と中身を変えること(追加や変更、削除が出来る)でイメージが掴めて来るかと思います。

さて、今回使う下書きに送るcreateDraftメソッドの書式は、

createDraft(アドレス,タイトル,本文);

になります。

では、コードを詳細に見て行きます。

const values=SpreadsheetApp.getActiveSheet().getDataRange().getValues();

長ったらしいですが、最初のSpreadsheetAppがスプレッドシートの1番トップの所、次のgetActiveSheet()が現在のシート、何で()となっているのかは、三角形の面積と違って、特に使うのに必要なものが無いからです。

その次のgetDataRange()は、このスプレッドシートのデータを二次元配列として取得するメソッドです。なので、スプレッドシートに書かれている値がそのまま二次元配列として取得できます。具体的には、配列valuesの[0][1]が得意先のヤマダ部長のアドレスで、values[3][1]が本文になっています。配列は先頭が0番目で次が1番目・・・と続きます。

最後のgetValues()で値が取得されます。

3番目のgetDataRange()で金魚すくいの網を貼って、最後のgetValues()で実際に釣り上げるイメージです。

const to=values[0][1];

ここでは、二次元配列valuesの座標[0][1]のところのアドレス「yamada@aiueo.co.jp」を、定数toに格納しています。

const subject=values[1][1];

ここでは、二次元配列valuesの座標[1][1]のところの「2月度のご案内」を、定数subjectに格納しています。

let body=””;

ここでは空の状態の本文を変数bodyに格納しています。この後文章を追加していくので、一旦からの物を用意する感じです。

body+=values[2][1]+’\n’;

ここでは配列valuesの[2][1]にある「株式会社あいうえお 営業部長ヤマダ様」をbodyに追加しています。+=については、

A=A+Bを、

A+=Bと書くことが出来ます。

また、’\n’とバックスラッシュnを加えることによって改行させています。

body+=values[3][1]+’\n’;

ここで、bodyに「お世話になっております・・・」を加えます。

これで、メソッドcreateDraftを使う(アドレス、タイトル、本文)が求まったので、下記のコードでGmailの下書きに入れられます。

GmailApp.createDraft(to,subject,body);

非常にシンプルなコードですが、これで以上です。

ここまでのコードをまとめます。

function createDraft() {

  //スプレッドシートのトップから現在のアクティブシートに階層を辿ってアクセスして、データを二次元配列として取得する
  const values=SpreadsheetApp.getActiveSheet().getDataRange().getValues();

  //相手先のアドレスを定数toに格納
  const to=values[0][1];

  //題名を定数subjectに格納
  const subject=values[1][1];
  
  //本文を定数bodyに格納し、改行して追加
  let body="";
  body+=values[2][1]+'\n';
  body+=values[3][1]+'\n';

  //Gmailの下書きへGo!!
  GmailApp.createDraft(to,subject,body);
  
}

ボタンを押すと、押した人のGmail の下書きにこの様に保存されます。

このシートをコピーして社内用に使い回して株式会社あいうえおのヤマダ部長との会議を上司のサトウ課長に報告することも可能です。

シートをコピーして、名前を変えます。

スプレッドシートの画面です。ボタンを押して作れた下書きです。

お疲れ様でした。ブレイクタイムフォトは、今2月なのに季節外れですが、六本木ヒルズで撮影したハロウィンの写真です。

・関連記事
六本木ヒルズ、ハロウィンでトリックオアトリート!?

■参考文献の紹介■
初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。

GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本を通してじっくり学べます。

サイトマップはこちらから

GASサンプル集に戻る
メインメニューに戻る
これからプログラミングを始める方へ
基本情報技術者へ
自己紹介

プログラミングのアンケートにご協力頂ける方はこちらのフォームで勉強法など色々と教えて下さい。

<ねこフォーム実践編3>著書「就職氷河期世代&大人の発達障害」の読者アンケート

この記事では、GAS(Google Apps script)を使って、私が2012年に書いた「就職氷河期世代&大人の発達障害」の読者様を対象としたアンケートを作成したコードを公開します。

まず、「就職氷河期世代&大人の発達障害」について、内容紹介のYouTube動画と購入先、アンケートのGoogleフォームを掲載します。

● 本のプロモーションビデオ

● 購入先は自己紹介と著作本から

● 完成した読者アンケート

読者アンケートも宜しくお願いします。

アンケートは上記のフォームから投票出来ます。

GASでのプログラミングでお世話になっているサイトは、いつも隣にITのお仕事さんの

GASでGoogleフォームを一発で作成するツールを作る

です。

まず、下記のような3枚のスプレッドシートを用意します。

・シート「トップ画面」

ここには、ボタンを設置して、このボタンを押すとフォームが作れるようにします。

・シート「フォームのタイトルと説明の情報」

ここには、作成するフォームのタイトルと説明文を入れます。

・シート「項目データ」

ここには、アンケート回答者がラジオボタン、チェックボックス、リストアイテムから選択出来るようスプレッドシートに配置しています。

このデータを二次元配列として取得して、各列ごとに1次元配列に変換して、ラジオボタンなどから選択出来るようにしています。

まず、スプレッドシートのボタンを押すとフォームが作れる関数、「pushButton」を作ります。

シート「フォームのタイトルと説明の情報」を二次元配列arrayとして取得して、array[0][1]をタイトル、array[1][1]をフォームの説明文として取得しています。

function pushButton() {

  //スプレッドシートのトップから現在のスプレッドシートにアクセスする 
  const ss=SpreadsheetApp.getActiveSpreadsheet();
  

  //フォームのタイトルと説明を取得
  const array=ss.getSheetByName('フォームのタイトルと説明の情報').getDataRange().getValues();
  const formTitle=array[0][1];//タイトル
  const formDescription=array[1][1];//概要

  
  //フォームを指定のタイトルと説明の元、作成する
  const form=FormApp.create(formTitle);  
  form.setDescription(formDescription);
 }

この部分ではフォームのプレビュー画面でこの様になります。

また、フォームにニックネームのテキストアイテムを追加します。

form.addTextItem().setTitle('ニックネームまたはイニシャル\n本名以外でお願いします。').setRequired(true);

ニックネームのテキストアイテム入力のプレビュー画面です。

では、いよいよスプレッドシートのシート「項目データ」からデータを取得して、フォームを作成して行きます。

まず、シート「項目データ」を二次元配列として取得するために、下記のコードを書きました。

//項目データからフォームに追加するアイテムの内容を取得
  const dataValues=ss.getSheetByName('項目データ').getDataRange().getValues();
  dataValues.shift()

このコードでは、定数dataValuesにシートを二次元配列として取得したデータを格納して、先頭のタイトル行をshisft()で削除しています。

この二次元配列の各行をフォームのアイテムから選択出来るように一次元配列に変換して、更に空白行を取り除く関数generateArrayを作成しました。

引数に二次元配列のデータとその行を指定して関数generateArrayに送ります。

ここではmapで一次元配列に変換して、filterで空白行を取り除いています。

/**
 * シート「項目データ」全体の値を取得した二次元配列から、指定の列のデータを抜き出し一次元配列を構成する 
 * 
 * @param{Object[][]}シートのデータを二次元配列化とした配列
 * @param{number}配列の列数(0以上のインデックス)
 * @return{Object{}}指定の列(見出しを除く)のデータによる一次元配列
 */
function generateArray(values,column){
  return values.map(record=>record[column]).filter(value=>value);
}

関数呼び出し時には、下記のように指定しました。

A列「性別」は、ラジオボタンで、

generateArray(dataValues,0)

と記述し、引数に二次元配列のデータと列数を指定することで「性別」が選択出来ます。

テキストアイテムで学校名を入力します。

form.addMultipleChoiceItem()    //ラジオボタン
    .setTitle('性別')
    .setChoiceValues(generateArray(dataValues,0))
    .setRequired(true);

B列「ご年齢」の呼び出しは、リストアイテムで、

generateArray(dataValues,1)

です。

  form.addListItem()              //リストアイテム
    .setTitle('ご年齢')
    .setChoiceValues(generateArray(dataValues,1))
    .setRequired(true);

C列「お住まいの都道府県」はリストアイテムで、

generateArray(dataValues,2)

です。その他の項目も選択出来ます。

form.addListItem()              //リストアイテム
    .setTitle('お住まいの都道府県は?')
    .setChoiceValues(generateArray(dataValues,2))
    .setRequired(true);

C列「ご出身の都道府県」はリストアイテムで、

generateArray(dataValues,2)

です。

 form.addListItem()              //リストアイテム
    .setTitle('ご出身の都道府県は?')
    .setChoiceValues(generateArray(dataValues,2))
    .setRequired(true);

これはリストアイテムのタイトルを変えて2回呼び出しています。1回目の呼び出しはお住まい、2回目はご出身です。
ここまでのプレビュー画面です。

D列「あなたについて教えてください」はラジオボタンで、

generateArray(dataValues,3)

です。

これもその他を選択出来るようにしています。

 form.addMultipleChoiceItem()              //ラジオボラン
    .setTitle('あなたについて教えて下さい。')
    .setChoiceValues(generateArray(dataValues,3))
    .showOtherOption(true)//その他の選択肢
    .setRequired(true);

E列「この本を知ったきっかけを教えてください」はチェックボタンで、

generateArray(dataValues,4)

です。

これもその他を選択出来るようにしています。

form.addCheckboxItem()    //チェックボックス
    .setTitle('この本を知ったきっかけを教えて下さい')
    .setChoiceValues(generateArray(dataValues,4))
    .showOtherOption(true)//その他の選択肢
    .setRequired(true);

ここまでのプレビュー画面です。

この本を5段階評価で選択出来るようにスケールアイテムを使っています。

  //スケールアイテム
    form.addScaleItem().setTitle('この本を5段階評価で教えて下さい。\n 1:不満足 〜 5:大変良い').setRequired(true);

最後は自由に記入できるコメント入力用パラグラフテキストアイテムです。

  //長文パラグラフテキストアイテムコメント欄
    form.addParagraphTextItem().setTitle('ご意見ご感想などコメント欄');

マイドライブに保存する場合はここまででも良いのですが、指定のドライブに保存したい場合は、プロパティストアというものを使って、フォルダIDをFOLDER_IDという文字列に保存します。

フォルダIDはこちらになります。

このモザイク部分をXXXが32桁の所に実際のこちらのコードでFOLDER_IDに保存します。

//フォームを保存したいドライブのIDを指定して、1番最初に実行する。
function setScriptProperty(){
  PropertiesService.getScriptProperties().setProperty('FOLDER_ID','XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
}

その実行画面です。

この様に何も起こらないので不安になるかと思います。

そこで、FOLDER_IDに格納出来たのか確認するコードを書きました。

//プロパティストアにフォルダIDが格納されたことを確認する
function getScriptProperty(){
  const folderid=PropertiesService.getScriptProperties().getProperty('FOLDER_ID');
  console.log(folderid);
}

実行結果です。

あとはメインのpushButton関数に下記の4行のコードを追記します。

プロパティストアからFOLDER_IDを取り出して、フォームをそこに格納し、マイドライブに出来てしまったフォームの方は削除します。

 //指定のフォルダに保存する。この4行をコメントアウトするとマイドライブ(ルートディレクトリ)に保存される
  const id=PropertiesService.getScriptProperties().getProperty('FOLDER_ID');//格納するフォルダIDを取り出す
  const formFile=DriveApp.getFileById(form.getId());//作成したフォームをオブジェクトとして取得
  DriveApp.getFolderById(id).addFile(formFile);//指定のフォルダにFileオブジェクトを追加する
  DriveApp.getRootFolder().removeFile(formFile);//マイフォルダからFileオブジェクトを削除する

コメントにもある様、マイドライブ(ルードディレクトリ)に保存したい場合は、一旦コメントアウトをしておいても状況に寄っては宜しいかもしれません。

ここまでの説明で、もう少し詳しくプロパティストアについて知りたいという方は、

<ねこフォーム2>GASで作成したフォームを指定のフォルダに格納する

をご覧ください。

では、これまでのコードをまとめます。

/**
 * シート「項目データ」全体の値を取得した二次元配列から、指定の列のデータを抜き出し一次元配列を構成する 
 * 
 * @param{Object[][]}シートのデータを二次元配列化とした配列
 * @param{number}配列の列数(0以上のインデックス)
 * @return{Object{}}指定の列(見出しを除く)のデータによる一次元配列
 */
function generateArray(values,column){
  return values.map(record=>record[column]).filter(value=>value);
}


function pushButton() {

  //スプレッドシートのトップから現在のスプレッドシートにアクセスする 
  const ss=SpreadsheetApp.getActiveSpreadsheet();
  

  //フォームのタイトルと説明を取得
  const array=ss.getSheetByName('フォームのタイトルと説明の情報').getDataRange().getValues();
  const formTitle=array[0][1];//タイトル
  const formDescription=array[1][1];//概要

  
  //フォームを指定のタイトルと説明の元、作成する
  const form=FormApp.create(formTitle);  
  form.setDescription(formDescription);
 

 //項目データからフォームに追加するアイテムの内容を取得
  const dataValues=ss.getSheetByName('項目データ').getDataRange().getValues();
  dataValues.shift()

 form.addTextItem().setTitle('ニックネームまたはイニシャル\n本名以外でお願いします。').setRequired(true);


  form.addMultipleChoiceItem()    //ラジオボタン
    .setTitle('性別')
    .setChoiceValues(generateArray(dataValues,0))
    .setRequired(true);

  form.addListItem()              //リストアイテム
    .setTitle('ご年齢')
    .setChoiceValues(generateArray(dataValues,1))
    .setRequired(true);

  form.addListItem()              //リストアイテム
    .setTitle('お住まいの都道府県は?')
    .setChoiceValues(generateArray(dataValues,2))
    .setRequired(true);


  form.addListItem()              //リストアイテム
    .setTitle('ご出身の都道府県は?')
    .setChoiceValues(generateArray(dataValues,2))
    .setRequired(true);

  
  form.addMultipleChoiceItem()              //ラジオボラン
    .setTitle('あなたについて教えて下さい。')
    .setChoiceValues(generateArray(dataValues,3))
    .showOtherOption(true)//その他の選択肢
    .setRequired(true);


  form.addCheckboxItem()    //チェックボックス
    .setTitle('この本を知ったきっかけを教えて下さい')
    .setChoiceValues(generateArray(dataValues,4))
    .showOtherOption(true)//その他の選択肢
    .setRequired(true);

    //スケールアイテム
    form.addScaleItem().setTitle('この本を5段階評価で教えて下さい。\n 1:不満足 〜 5:大変良い').setRequired(true);

    //長文パラグラフテキストアイテムコメント欄
    form.addParagraphTextItem().setTitle('ご意見ご感想などコメント欄');
  

  //指定のフォルダに保存する。この4行をコメントアウトするとマイドライブ(ルートディレクトリ)に保存される
  const id=PropertiesService.getScriptProperties().getProperty('FOLDER_ID');//格納するフォルダIDを取り出す
  const formFile=DriveApp.getFileById(form.getId());//作成したフォームをオブジェクトとして取得
  DriveApp.getFolderById(id).addFile(formFile);//指定のフォルダにFileオブジェクトを追加する
  DriveApp.getRootFolder().removeFile(formFile);//マイフォルダからFileオブジェクトを削除する


}


//フォームを保存したいドライブのIDを指定して、1番最初に実行する。
function setScriptProperty(){
  PropertiesService.getScriptProperties().setProperty('FOLDER_ID','XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
}


//プロパティストアにフォルダIDが格納されたことを確認する
function getScriptProperty(){
  const folderid=PropertiesService.getScriptProperties().getProperty('FOLDER_ID');
  console.log(folderid);
}

あとはスプレッドシートのトップ画面のボタンの右上3点リーダーからスクリプトを「pushButton」に割り当てて押すと、あなたが指定したフォルダ、またはマイドライブに保存されます。

お疲れ様でした、ブレイクタイムフォトはこちらになります。

東京都葛飾区、水元公園 2018年コロナ前のゴールデンウィークにサイクリング

■参考文献の紹介■
初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。

GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本を通してじっくり学べます。

サイトマップはこちらから

GASサンプル集に戻る
メインメニューに戻る
これからプログラミングを始める方へ
基本情報技術者へ
自己紹介

←<ねこフォーム実践編2>プログラミングのアンケートに戻る

<ねこフォーム実践編2>プログラミング学習アンケート

この記事では、GAS(Google Apps script)を使って、プログラミング学習者向け(さっき始めたばかりの方から、何十年もやっているベテランの方まで)を対象としたアンケートを作成します。

プログラミングのアンケートにご協力頂ける方はこちらのフォームで勉強法など色々と教えて下さい。

お世話になっているサイトは、いつも隣にITのお仕事さんの

GASでGoogleフォームを一発で作成するツールを作る

です。

まず、下記のような3枚のスプレッドシートを用意します。

・シート「トップ画面」

ここには、ボタンを設置して、このボタンを押すとフォームが作れるようにします。

・シート「フォームのタイトルと説明の情報」

ここには、作成するフォームのタイトルと説明文を入れます。

・シート「項目データ」

ここには、アンケート回答者がラジオボタン、チェックボックス、リストアイテムから選択出来るようスプレッドシートに配置しています。

このデータを二次元配列として取得して、各列ごとに1次元配列に変換して、ラジオボタンなどから選択出来るようにしています。

まず、スプレッドシートのボタンを押すとフォームが作れる関数、「pushButton」を作ります。

function pushButton() {

  //スプレッドシートのトップから現在のスプレッドシートにアクセスする 
  const ss=SpreadsheetApp.getActiveSpreadsheet();
  

  //フォームのタイトルと説明を取得
  const array=ss.getSheetByName('フォームのタイトルと説明の情報').getDataRange().getValues();
  const formTitle=array[0][1];//タイトル
  const formDescription=array[1][1];//概要

  //フォームを指定のタイトルと説明の元、作成する
  const form=FormApp.create(formTitle);  
  form.setDescription(formDescription);
 }

シート「フォームのタイトルと説明の情報」を二次元配列arrayとして取得して、array[0][1]をタイトル、array[1][1]をフォームの説明文として取得しています。

では、いよいよスプレッドシートのシート「項目データ」からデータを取得して、フォームを作成して行きます。

まず、シート「項目データ」を二次元配列として取得するために、下記のコードを書きました。

//項目データからフォームに追加するアイテムの内容を取得
  const dataValues=ss.getSheetByName('項目データ').getDataRange().getValues();
  dataValues.shift()

このコードでは、定数dataValuesにシートを二次元配列として取得したデータを格納して、先頭のタイトル行をshisft()で削除しています。

この二次元配列の各行をフォームのアイテムから選択出来るように一次元配列に変換して、更に空白行を取り除く関数generateArrayを作成しました。

引数に二次元配列のデータとその行を指定して関数generateArrayに送ります。

ここではmapで一次元配列に変換して、filterで空白行を取り除いています。

/**
 * シート「項目データ」全体の値を取得した二次元配列から、指定の列のデータを抜き出し一次元配列を構成する 
 * 
 * @param{Object[][]}シートのデータを二次元配列化とした配列
 * @param{number}配列の列数(0以上のインデックス)
 * @return{Object{}}指定の列(見出しを除く)のデータによる一次元配列
 */
function generateArray(values,column){
  return values.map(record=>record[column]).filter(value=>value);
}

関数呼び出し時には、下記のように指定しました。

A列「性別」は、ラジオボタン(※必須)で、

generateArray(dataValues,0)

と記述し、引数に二次元配列のデータと列数を指定することで「性別」が選択出来ます。

form.addMultipleChoiceItem()    //ラジオボタン
    .setTitle('性別')
    .setChoiceValues(generateArray(dataValues,0))
    .setRequired(true);

B列「年齢」の呼び出しは、リストアイテム(※必須)で、

generateArray(dataValues,1)

です。

form.addListItem()              //プルダウン
    .setTitle('ご年齢')
    .setChoiceValues(generateArray(dataValues,1))
    .setRequired(true);

C列「出身在住都道府県」はリストアイテム(※必須)で、

generateArray(dataValues,2)

です。タイトルを変えて2回呼び出すことで、お住まいの都道府県と出身地を入力できます。

form.addListItem()              //プルダウン
    .setTitle('お住まいの都道府県は?')
    .setChoiceValues(generateArray(dataValues,2))
    .setRequired(true);


  form.addListItem()              //プルダウン
    .setTitle('ご出身の都道府県は?')
    .setChoiceValues(generateArray(dataValues,2))
    .setRequired(true);

D列「プログラミング歴」はリストアイテム(※必須)で、

generateArray(dataValues,3)

です。

form.addListItem()              //プルダウン
    .setTitle('プログラミング歴')
    .setChoiceValues(generateArray(dataValues,3))
    .setRequired(true);

E列「学習済み言語・1番得意な言語」はチェックボックスとラジオボタン(※必須)で、タイトルを変えて2回呼び出しています。

generateArray(dataValues,4)

です。

これらもそれぞれ、「その他」を選択出来るようにしています。

form.addCheckboxItem()    //チェックボックス
    .setTitle('学習をしたことのある言語')
    .setChoiceValues(generateArray(dataValues,4))
    .showOtherOption(true)//その他の選択肢
    .setRequired(true);

  form.addMultipleChoiceItem()    //ラジオボタン
    .setTitle('1番得意な言語')
    .setChoiceValues(generateArray(dataValues,4))
    .showOtherOption(true)//その他の選択肢
    .setRequired(true);

F列「学習のきっかけ」はチェックボックス(※必須)です。

generateArray(dataValues,5)

form.addCheckboxItem()    //チェックボックス
    .setTitle('始めたきっかけ')
    .setChoiceValues(generateArray(dataValues,5))
    .showOtherOption(true)//その他の選択肢
    .setRequired(true);

G列「学習コンテンツ」はチェックボックス(※必須)です。

generateArray(dataValues,6)

    form.addCheckboxItem()    //チェックボックス
    .setTitle('利用学習コンテンツ')
    .setChoiceValues(generateArray(dataValues,6))
    .showOtherOption(true)//その他の選択肢
    .setRequired(true);

これ以降は、セミナーの内容が5段階評価で選択出来るようにスケールアイテムを使っています。(※必須)

//スケールアイテム
    form.addScaleItem().setTitle('あなたはどれぐらいプログラミングが好きですか?\n 1:あまり好きではない 〜 5:大好き').setRequired(true);

    form.addScaleItem().setTitle('あなたはどれぐらいプログラミングが得意ですか?\n 1:あまり得意ではない 〜 5:物凄く得意').setRequired(true);

最後は自由に記入できるコメント入力用パラグラフテキストアイテムです。

//長文パラグラフテキストアイテムコメント欄
    form.addParagraphTextItem().setTitle('あなたのおすすめ勉強法やプログラミングの情報を教えて下さい。');

ここまでで実行すると、このようなフォームが作れます。これは目のマークでプレビューを押した画面です。

マイドライブに保存する場合はここまででも良いのですが、指定のドライブに保存したい場合は、プロパティストアというものを使って、フォルダIDをFOLDER_IDという文字列に保存します。

フォルダIDはこちらになります。

このモザイク部分をこちらのコードでXXXが32桁の所に実際のFOLDER_IDに保存します。

//フォームを保存したいドライブのIDを指定して、1番最初に実行する。
function setScriptProperty(){
  PropertiesService.getScriptProperties().setProperty('FOLDER_ID','XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
}

その実行画面です。

この様に何も起こらないので不安になるかと思います。

そこで、FOLDER_IDに格納出来たのか確認するコードを書きました。

//プロパティストアにフォルダIDが格納されたことを確認する
function getScriptProperty(){
  const folderid=PropertiesService.getScriptProperties().getProperty('FOLDER_ID');
  console.log(folderid);
}

実行結果です。

あとはメインのpushButton関数にこの4行のコードを追記します。

プロパティストアからFOLDER_IDを取り出して、フォームをそこに格納し、マイドライブに出来てしまったフォームの方は削除します。

//指定のフォルダに保存する。この4行をコメントアウトするとマイドライブ(ルートディレクトリ)に保存される
  const id=PropertiesService.getScriptProperties().getProperty('FOLDER_ID');//格納するフォルダIDを取り出す
  const formFile=DriveApp.getFileById(form.getId());//作成したフォームをオブジェクトとして取得
  DriveApp.getFolderById(id).addFile(formFile);//指定のフォルダにFileオブジェクトを追加する
  DriveApp.getRootFolder().removeFile(formFile);//マイフォルダからFileオブジェクトを削除する

コメントにもある様、マイドライブ(ルードディレクトリ)に保存したい場合は、一旦コメントアウトをしておいても状況に寄っては宜しいかもしれません。

ここまでの説明で、もう少し詳しくプロパティストアについて知りたいという方は、

<ねこフォーム2>GASで作成したフォームを指定のフォルダに格納する

をご覧ください。

では、これまでのコードをまとめます。

/**
 * シート「項目データ」全体の値を取得した二次元配列から、指定の列のデータを抜き出し一次元配列を構成する 
 * 
 * @param{Object[][]}シートのデータを二次元配列化とした配列
 * @param{number}配列の列数(0以上のインデックス)
 * @return{Object{}}指定の列(見出しを除く)のデータによる一次元配列
 */
function generateArray(values,column){
  return values.map(record=>record[column]).filter(value=>value);
}


function pushButton() {

  //スプレッドシートのトップから現在のスプレッドシートにアクセスする 
  const ss=SpreadsheetApp.getActiveSpreadsheet();
  

  //フォームのタイトルと説明を取得
  const array=ss.getSheetByName('フォームのタイトルと説明の情報').getDataRange().getValues();
  const formTitle=array[0][1];//タイトル
  const formDescription=array[1][1];//概要

  
  //フォームを指定のタイトルと説明の元、作成する
  const form=FormApp.create(formTitle);  
  form.setDescription(formDescription);
 

 //項目データからフォームに追加するアイテムの内容を取得
  const dataValues=ss.getSheetByName('項目データ').getDataRange().getValues();
  dataValues.shift()

 
  form.addMultipleChoiceItem()    //ラジオボタン
    .setTitle('性別')
    .setChoiceValues(generateArray(dataValues,0))
    .setRequired(true);

  form.addListItem()              //プルダウン
    .setTitle('ご年齢')
    .setChoiceValues(generateArray(dataValues,1))
    .setRequired(true);

  form.addListItem()              //プルダウン
    .setTitle('お住まいの都道府県は?')
    .setChoiceValues(generateArray(dataValues,2))
    .setRequired(true);


  form.addListItem()              //プルダウン
    .setTitle('ご出身の都道府県は?')
    .setChoiceValues(generateArray(dataValues,2))
    .setRequired(true);

  
  form.addListItem()              //プルダウン
    .setTitle('プログラミング歴')
    .setChoiceValues(generateArray(dataValues,3))
    .setRequired(true);


  form.addCheckboxItem()    //チェックボックス
    .setTitle('学習をしたことのある言語')
    .setChoiceValues(generateArray(dataValues,4))
    .showOtherOption(true)//その他の選択肢
    .setRequired(true);

  form.addMultipleChoiceItem()    //ラジオボタン
    .setTitle('1番得意な言語')
    .setChoiceValues(generateArray(dataValues,4))
    .showOtherOption(true)//その他の選択肢
    .setRequired(true);


    form.addCheckboxItem()    //チェックボックス
    .setTitle('始めたきっかけ')
    .setChoiceValues(generateArray(dataValues,5))
    .showOtherOption(true)//その他の選択肢
    .setRequired(true);



    form.addCheckboxItem()    //チェックボックス
    .setTitle('利用学習コンテンツ')
    .setChoiceValues(generateArray(dataValues,6))
    .showOtherOption(true)//その他の選択肢
    .setRequired(true);

    //スケールアイテム
    form.addScaleItem().setTitle('あなたはどれぐらいプログラミングが好きですか?\n 1:あまり好きではない 〜 5:大好き').setRequired(true);

    form.addScaleItem().setTitle('あなたはどれぐらいプログラミングが得意ですか?\n 1:あまり得意ではない 〜 5:物凄く得意').setRequired(true);


    //長文パラグラフテキストアイテムコメント欄
    form.addParagraphTextItem().setTitle('あなたのおすすめ勉強法やプログラミングの情報を教えて下さい。');
  

  //指定のフォルダに保存する。この4行をコメントアウトするとマイドライブ(ルートディレクトリ)に保存される
  const id=PropertiesService.getScriptProperties().getProperty('FOLDER_ID');//格納するフォルダIDを取り出す
  const formFile=DriveApp.getFileById(form.getId());//作成したフォームをオブジェクトとして取得
  DriveApp.getFolderById(id).addFile(formFile);//指定のフォルダにFileオブジェクトを追加する
  DriveApp.getRootFolder().removeFile(formFile);//マイフォルダからFileオブジェクトを削除する


}


//フォームを保存したいドライブのIDを指定して、1番最初に実行する。
function setScriptProperty(){
  PropertiesService.getScriptProperties().setProperty('FOLDER_ID','XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
}


//プロパティストアにフォルダIDが格納されたことを確認する
function getScriptProperty(){
  const folderid=PropertiesService.getScriptProperties().getProperty('FOLDER_ID');
  console.log(folderid);
}

あとはスプレッドシートのトップ画面のボタンの右上3点リーダーからスクリプトを「pushButton」に割り当てて押すと、あなたが指定したフォルダ、またはマイドライブに保存されます。

お疲れ様でした、ブレイクタイムフォトはこちらになります。

東京都葛飾区にある新緑の水元公園。コロナ前2018年のゴールデンウィークにサイクリングに行きました。

■参考文献の紹介■
初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。

GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本を通してじっくり学べます。

サイトマップはこちらから

GASサンプル集に戻る
メインメニューに戻る
これからプログラミングを始める方へ
基本情報技術者へ
自己紹介

←ねこフォーム実践編1(セミナーアンケート)に戻る

ねこフォーム実践編3(就職氷河期世代&大人の発達障害読者アンケートに進む)→

<ねこフォーム8>ねこあつめフォームに「スケールアイテム」と「パラグラフテキストアイテム」を追加する

この記事では、GAS(Google Apps script)でねこあつめフォームに「スケールアイテム(5段階評価)」と「パラグラフテキストアイテム(コメント長文入力)」を追加します。

お世話になっているサイトは、いつも隣にITのお仕事さんの

GASでGoogleフォームに追加できる質問の種類とそのメソッドまとめ

です。

まずは、前回のおさらいをします。

「お名前」と「1番お気に入りのグッズ」と「めあど」はテキストアイテムをコードに記述して、「スプレッドシートから、ラジオボタン、チェックボックス、リストアイテムを取得する」コードを追加しました。

下記のコードを実行すると、このようなフォーム(目のマークのプレビュー画面)を得られます。

function myFunction() {

  //SpreadsheetAppから現在のスプレッドシートにアクセス
  const ss=SpreadsheetApp.getActiveSpreadsheet();

  //シート名「イベント概要」のデータを配列として取得する
  const values=ss.getSheetByName('イベント概要').getDataRange().getValues();
  const formTitle=values[0][1];//タイトル
  const formDescription=values[1][1];//概要
  
  //フォームを作成
  const form=FormApp.create(formTitle);


  //ここでプロパティストアに格納したFOLDER_IDを使って、指定のフォルダにフォームを作成する
  const id=PropertiesService.getScriptProperties().getProperty('FOLDER_ID');//idにFOLDER_IDを格納する
  const formFile=DriveApp.getFileById(form.getId());//作成したフォームのIDをformFileに格納する
  DriveApp.getFolderById(id).addFile(formFile);//指定のフォルダにフォームを格納する
  DriveApp.getRootFolder().removeFile(formFile);//マイドライブに作成されたフォームを削除する


  //フォームの説明を作成
  form.setDescription(formDescription);

  //テキストアイテムを追加する
  form.addTextItem().setTitle('おなまえ').setRequired(true);//trueにすることで、入力必須にしている。
  form.addTextItem().setTitle('1番お気に入りのグッズ');


  //メールアドレスのテキストアイテムを加える
  const validationEmail=FormApp.createTextValidation().requireTextIsEmail().build();
  form.addTextItem().setTitle('めあど').setRequired(true).setValidation(validationEmail);


  //←シート「項目データ」から、フォームに追加するアイテムの内容を二次元配列として取得する
  const dataValues=ss.getSheetByName('項目データ').getDataRange().getValues();
  dataValues.shift();

  /**
   * シート「項目データ」の値を二次元配列として取得して、指定の列を抜き出し一次元配列を構成する
   * 
   * @param{Object[][]}シート「項目データ」を二次元配列として取得したデータ
   * @param{number} 配列の列数(0以上のインデックス)
   * @return{Object[]} 指定の列の見出しタイトル行を除くデータによる一次元配列
   * 
   */
  function generateArray(values,column){
    return values.map(record=>record[column]).filter(value=>value);
  }
  
  
  //ラジオボタンを加える
  form.addMultipleChoiceItem()
    .setTitle('ねこ種類')
    .setChoiceValues(generateArray(dataValues,0))
    .setRequired(true);

  //チェックボックスを追加する
  form.addCheckboxItem()
    .setTitle('他にあそんだグッズ')
    .setChoiceValues(generateArray(dataValues,1)) 
    .showOtherOption(true)//その他のチェックボックスを作っている
    .setRequired(true); 

  //←リストアイテムを追加する
  form.addListItem()
    .setTitle('ねこちゃんの都道府県')
    .setChoiceValues(generateArray(dataValues,2)) 
    .setRequired(true); 

}

今回の内容に入る前に、ねこあつめ画像で癒されます。

まるこたつで「とびちゃん」がごめん寝してる(=^x^=)

さて、今回は5段階評価などで使う「スケールアイテム」と、長文のコメントを書ける様になる「パラグラフテキストアイテム」を追加します。

それぞれの部品をフォームに追加するコードはこちらになります。

・スケールアイテム のコード

//あなたの「ねこ度」をスケールアイテムで追加する
  form.addScaleItem().setTitle('あなたのねこ度は? 1:低い 〜 5:高い').setRequired(true);//trueにすることで、入力必須にしている。

・パラグラフテキストアイテムのコード

//ご意見ご要望をパラグラフテキストアイテムで追加する
  form.addParagraphTextItem().setTitle('ご意見ご要望').setRequired(true);//trueにすることで、入力必須にしている。

以上になります。
他にも日付を入れるアイテムとかありましたが、実際に良く使われるのは、スケールアイテムやパラグラフテキストアイテムだと思って、そこに絞って追加しました。

最後にこれまでのコードです。
指定のフォルダに保存したい場合は最初に「setScriptProperty」の32桁のXXX…XXXの所にフォルダIDを指定して実行してから、正しく格納されたことを
「getScriptProperty」で確認してからメインの「myFunction」を実行して下さい。

function myFunction() {

  //SpreadsheetAppから現在のスプレッドシートにアクセス
  const ss=SpreadsheetApp.getActiveSpreadsheet();

  //シート名「イベント概要」のデータを配列として取得する
  const values=ss.getSheetByName('イベント概要').getDataRange().getValues();
  const formTitle=values[0][1];//タイトル
  const formDescription=values[1][1];//概要
  
  //フォームを作成
  const form=FormApp.create(formTitle);


  //ここでプロパティストアに格納したFOLDER_IDを使って、指定のフォルダにフォームを作成する
  const id=PropertiesService.getScriptProperties().getProperty('FOLDER_ID');//idにFOLDER_IDを格納する
  const formFile=DriveApp.getFileById(form.getId());//作成したフォームのIDをformFileに格納する
  DriveApp.getFolderById(id).addFile(formFile);//指定のフォルダにフォームを格納する
  DriveApp.getRootFolder().removeFile(formFile);//マイドライブに作成されたフォームを削除する


  //フォームの説明を作成
  form.setDescription(formDescription);

  //テキストアイテムを追加する
  form.addTextItem().setTitle('おなまえ').setRequired(true);//trueにすることで、入力必須にしている。
  form.addTextItem().setTitle('1番お気に入りのグッズ');


  //メールアドレスのテキストアイテムを加える
  const validationEmail=FormApp.createTextValidation().requireTextIsEmail().build();
  form.addTextItem().setTitle('めあど').setRequired(true).setValidation(validationEmail);


  //←シート「項目データ」から、フォームに追加するアイテムの内容を二次元配列として取得する
  const dataValues=ss.getSheetByName('項目データ').getDataRange().getValues();
  dataValues.shift();

  /**
   * シート「項目データ」の値を二次元配列として取得して、指定の列を抜き出し一次元配列を構成する
   * 
   * @param{Object[][]}シート「項目データ」を二次元配列として取得したデータ
   * @param{number} 配列の列数(0以上のインデックス)
   * @return{Object[]} 指定の列の見出しタイトル行を除くデータによる一次元配列
   * 
   */
  function generateArray(values,column){
    return values.map(record=>record[column]).filter(value=>value);
  }
  
  
  //ラジオボタンを加える
  form.addMultipleChoiceItem()
    .setTitle('ねこ種類')
    .setChoiceValues(generateArray(dataValues,0))
    .setRequired(true);

  //チェックボックスを追加する
  form.addCheckboxItem()
    .setTitle('他にあそんだグッズ')
    .setChoiceValues(generateArray(dataValues,1)) 
    .showOtherOption(true)//その他のチェックボックスを作っている
    .setRequired(true); 

  //リストアイテムを追加する
  form.addListItem()
    .setTitle('ねこちゃんの都道府県')
    .setChoiceValues(generateArray(dataValues,2)) 
    .setRequired(true); 


  //←あなたの「ねこ度」をスケールアイテムで追加する
  form.addScaleItem().setTitle('あなたのねこ度は? 1:低い 〜 5:高い').setRequired(true);//trueにすることで、入力必須にしている。


  //←ご意見ご要望をパラグラフテキストアイテムで追加する
  form.addParagraphTextItem().setTitle('ご意見ご要望').setRequired(true);//trueにすることで、入力必須にしている。


}



//プロパティストアにフォルダIDを格納する
function setScriptProperty(){
  PropertiesService.getScriptProperties().setProperty('FOLDER_ID','XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
}

//プロパティストアにフォルダIDが格納されたことを確認する
function getScriptProperty(){
  const folderid=PropertiesService.getScriptProperties().getProperty('FOLDER_ID');
  console.log(folderid);

}

ねこフォームの基礎はこの記事で最終回にして、次からはフォーム実践編に入リます。長らくご精読ありがとうございました。

■参考文献の紹介■
初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。

GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本を通してじっくり学べます。

サイトマップはこちらから

GASサンプル集に戻る
メインメニューに戻る
これからプログラミングを始める方へ
基本情報技術者へ
自己紹介

←前に戻るにゃん

<ねこフォーム実践1>就職セミナーアンケート

この記事では、GAS(Google Apps script)を使って、おおよそのセミナーや、企業説明会で使える参加者向けのアンケートを作成します。

お世話になっているサイトは、いつも隣にITのお仕事さんの

GASでGoogleフォームを一発で作成するツールを作る

です。

まず、下記のような3枚のスプレッドシートを用意します。

・シート「トップ画面」

ここには、ボタンを設置して、後でこのボタンを押すとフォームが作れるようにします。

・シート「フォームのタイトルと説明の情報」

ここには、作成するフォームのタイトルと説明文を入れます。

シート「項目データ」

ここには、アンケート回答者がラジオボタン、チェックボックス、リストアイテムから選択出来るようスプレッドシートに配置しています。

このデータを二次元配列として取得して、各列ごとに1次元配列に変換して、ラジオボタンなどから選択出来るようにしています。

まず、スプレッドシートのボタンを押すとフォームが作れる関数、「pushButton」を作ります。

シート「フォームのタイトルと説明の情報」を二次元配列arrayとして取得して、array[0][1]をタイトル、array[1][1]をフォームの説明文として取得しています。

また、フォームに氏名とメールアドレスのテキストアイテムを追加します。

メールアドレスは@が含まれているなど、メールアドレスとして正しいかどうかを検証しています。

このメールアドレスとして検証するという部分については、

<ねこフォーム4>ねこあつめフォームに「メールアドレス」を追加する

で詳細に掲載致しました。

//このボタンを押すと、フォームが作成される。
function pushButton() {
  
  //シート「フォームのタイトルと説明の情報」からフォームのタイトルと説明を取得
  const ss=SpreadsheetApp.getActiveSpreadsheet();
  const array=ss.getSheetByName('フォームのタイトルと説明の情報').getDataRange().getValues();
  const formTitle=array[0][1];//タイトル
  const formDescription=array[1][1];//フォームの説明文

  
  //フォームを作成。タイトルにはシート「フォームのタイトルと説明の情報」のvalues[0][1]から取得される
  const form=FormApp.create(formTitle);

  //フォームの説明。フォームの説明文にはシート「フォームのタイトルと説明の情報」のvalues[1][1]から取得される
  form.setDescription(formDescription);


  //以下、フォームの設問の項目
  form.addTextItem().setTitle('氏名').setRequired(true); //氏名は入力必須項目にしている。

  const validationEmail=FormApp.createTextValidation().requireTextIsEmail().build();//eメールアドレスが正しいか検証
  form.addTextItem().setTitle('メールアドレス').setRequired(true).setValidation(validationEmail);
}

では、いよいよスプレッドシートのシート「項目データ」からデータを取得して、フォームを作成して行きます。

まず、シート「項目データ」を二次元配列として取得するために、下記のコードを書きました。

//以下、シート「項目データ」から取得している。
  //シート「項目データ」からフォームの質問の項目を二次元配列として取得し、その二次元配列のタイトル行を削除する
  const dataValues=ss.getSheetByName('項目データ').getDataRange().getValues();
  dataValues.shift()

このコードでは、定数dataValuesにシートを二次元配列として取得したデータを格納して、先頭のタイトル行をshisft()で削除しています。

この二次元配列の各行をフォームのアイテムから選択出来るように一次元配列に変換して、更に空白行を取り除く関数generateArrayを作成しました。

引数に二次元配列のデータとその行を指定して関数generateArrayに送ります。

ここではmapで一次元配列に変換して、filterで空白行を取り除いています。

/**
 * フォームのアイテムの内容をスプレッドシートから取得する関数
 * シート「項目データ」の値を取得した二次元配列から、指定の列のデータを抜き出し一次元配列を構成する。その為、mapを使っている。
 * その際、列の空白データを削除するためにfilterも使っている。 
 * 
 * @param{Object[][]}シートのデータを二次元配列化とした配列
 * @param{number}配列の列数(0以上のインデックス)
 * @return{Object{}}指定の列(見出しを除く)のデータによる一次元配列
 */
function generateArray(values,column){
  return values.map(record=>record[column]).filter(value=>value);
}

関数呼び出し時には、下記のように指定しました。

A列「性別」は、ラジオボタンで、

generateArray(dataValues,0)

と記述し、引数に二次元配列のデータと列数を指定することで「性別」が選択出来ます。

form.addMultipleChoiceItem()    //ラジオボタンはシート「項目データ」の「0列目」から取得している。
    .setTitle('性別')
    .setChoiceValues(generateArray(dataValues,0))
    .setRequired(true);

テキストアイテムで学校名を入力します。

form.addTextItem().setTitle('在学、卒業の学校名').setRequired(true);//入力はテキストアイテム

B列「学部」の呼び出しは、ラジオボタンで、

generateArray(dataValues,1)

です。その他の学部も選択記載出来るようにしています。

form.addMultipleChoiceItem()    //ラジオボタンはシート「項目データー」の「1列目」から取得している
    .setTitle('学部')
    .setChoiceValues(generateArray(dataValues,1))
    .showOtherOption(true)//その他の選択肢

学科・コースはテキストアイテムで入力します。

form.addTextItem().setTitle('学科・コース');

C列「卒業・在学の区分」はラジオボタン(※必須)で、

generateArray(dataValues,2)

です。その他の項目も選択出来ます。

form.addMultipleChoiceItem()    //ラジオボタンはシート「項目データ」の「2列目」から取得している
    .setTitle('卒業・在学の区分')
    .setChoiceValues(generateArray(dataValues,2))
    .showOtherOption(true)//その他の選択肢
    .setRequired(true);

D列「出身・在住の都道府県」はリストアイテム(※必須)で、

generateArray(dataValues,3)

です。

これはリストアイテムのタイトルを変えて2回呼び出しています。

1回目の呼び出しはお住まい、2回目は出身です。

form.addListItem()  //リストアイテムはシート「項目データ」の「3列目」から取得している  
    .setTitle('お住まいの都道府県は?')
    .setChoiceValues(generateArray(dataValues,3))
    .setRequired(true);


  form.addListItem()   //リストアイテムはシート「項目データ」の「3列目」から取得している
    .setTitle('ご出身の都道府県は?')
    .setChoiceValues(generateArray(dataValues,3))
    .setRequired(true);

E列「当社を知った媒体」はチェックボックス(※必須)で、

generateArray(dataValues,4)

です。

これもその他を選択出来るようにしています。

form.addCheckboxItem()    //チェックボックスはシート「項目データ」の「4列目」から取得している
    .setTitle('当社を知った媒体はどちらでしょうか。')
    .setChoiceValues(generateArray(dataValues,4))
    .showOtherOption(true)//その他の選択肢
    .setRequired(true);

これ以降は、セミナーの内容が5段階評価で選択出来るようにスケールアイテムを使っています。(※必須)

//以下、スケールアイテム
  
  form.addScaleItem()
    .setTitle('講師の声の聞き取りやすさ     1: 全く良くない  〜  5: 大変良い')
    .setBounds(1,5)
    .setRequired(true);


  form.addScaleItem()
    .setTitle('講師の説明の分かりやすさ     1: 全く分からない  〜  5: 大変分かりやすい')
    .setBounds(1,5)
    .setRequired(true);


  form.addScaleItem()
    .setTitle('スタッフの身だしなみ     1: 全く良くない  〜  5: 大変良い')
    .setBounds(1,5)
    .setRequired(true);

  form.addScaleItem()
    .setTitle('スタッフの対応    1: 全く良くない  〜  5: 大変良い')
    .setBounds(1,5)
    .setRequired(true);


    form.addScaleItem()
    .setTitle('当社志望度    1: 低い  〜  5: 高い')
    .setBounds(1,5)
    .setRequired(true);

最後は自由に記入できる段落入力アイテムです。

form.addParagraphTextItem().setTitle('ご意見ご要望');//段落テキストアイテム

ここまでで実行すると、このようなフォームが作れます。これは目のマークでプレビューを押した画面です。

マイドライブに保存する場合はここまででも良いのですが、指定のドライブに保存したい場合は、プロパティストアというものを使って、フォルダIDをFOLDER_IDという文字列に保存します。

フォルダIDはこちらになります。

このモザイク部分32桁をこちらのコードでFOLDER_IDに保存します。
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXを実際のフォルダーIDに置き換えて下さい。特定のフォルダに指定する場合は、pushButtonを押すよりも先にこちらを実行して下さい。

//フォームを保存したいドライブのIDを指定して、1番最初に実行する。
function setScriptProperty(){
  PropertiesService.getScriptProperties().setProperty('FOLDER_ID','XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
}

その実行画面です。

この様に何も起こらないので不安になるかと思います。

そこで、FOLDER_IDに格納出来たのか確認するコードを書きました。

//プロパティストアにフォルダIDが格納されたことを確認する
function getScriptProperty(){
  const folderid=PropertiesService.getScriptProperties().getProperty('FOLDER_ID');
  console.log(folderid);

実行結果です。先ほどのフォルダーID32桁が無事に表示されましたので、モザイク処理を施しました。

あとはメインの関数にこの4行のコードを追記します。

プロパティストアからFOLDER_IDを取り出して、フォームをそこに格納し、マイドライブに出来てしまったフォームの方は削除します。

//ここの4行ををコメントアウトすることで、マイドライブに保存が出来る。
  //フォームを指定のドライブに保存する
  const id=PropertiesService.getScriptProperties().getProperty('FOLDER_ID');//格納するフォルダIDを取り出す
  const formFile=DriveApp.getFileById(form.getId());//作成したフォームをオブジェクトとして取得
  DriveApp.getFolderById(id).addFile(formFile);//指定のフォルダにFileオブジェクトを追加する
  DriveApp.getRootFolder().removeFile(formFile);//マイフォルダからFileオブジェクトを削除する

コメントにもある様、マイドライブ(ルードディレクトリ)に保存したい場合は、一旦コメントアウトをしておいても状況に寄っては宜しいかもしれません。

ここまでの説明で、もう少し詳しくプロパティストアについて知りたいという方は、

<ねこフォーム2>GASで作成したフォームを指定のフォルダに格納する

をご覧ください。

では、これまでのコードをまとめます。

/**
 * フォームのアイテムの内容をスプレッドシートから取得する関数
 * シート「項目データ」の値を取得した二次元配列から、指定の列のデータを抜き出し一次元配列を構成する。その為、mapを使っている。
 * その際、列の空白データを削除するためにfilterも使っている。 
 * 
 * @param{Object[][]}シートのデータを二次元配列化とした配列
 * @param{number}配列の列数(0以上のインデックス)
 * @return{Object{}}指定の列(見出しを除く)のデータによる一次元配列
 */
function generateArray(values,column){
  return values.map(record=>record[column]).filter(value=>value);
}


//このボタンを押すと、フォームが作成される。
function pushButton() {
  
  //シート「フォームのタイトルと説明の情報」からフォームのタイトルと説明を取得
  const ss=SpreadsheetApp.getActiveSpreadsheet();
  const array=ss.getSheetByName('フォームのタイトルと説明の情報').getDataRange().getValues();
  const formTitle=array[0][1];//タイトル
  const formDescription=array[1][1];//フォームの説明文

  
  //フォームを作成。タイトルにはシート「フォームのタイトルと説明の情報」のvalues[0][1]から取得される
  const form=FormApp.create(formTitle);

  //フォームの説明。フォームの説明文にはシート「フォームのタイトルと説明の情報」のvalues[1][1]から取得される
  form.setDescription(formDescription);


  //以下、フォームの設問の項目
  form.addTextItem().setTitle('氏名').setRequired(true); //氏名は入力必須項目にしている。

  const validationEmail=FormApp.createTextValidation().requireTextIsEmail().build();//eメールアドレスが正しいか検証
  form.addTextItem().setTitle('メールアドレス').setRequired(true).setValidation(validationEmail);

  
  //以下、シート「項目データ」から取得している。
  //シート「項目データ」からフォームの質問の項目を二次元配列として取得し、その二次元配列のタイトル行を削除する
  const dataValues=ss.getSheetByName('項目データ').getDataRange().getValues();
  dataValues.shift()
  

  form.addMultipleChoiceItem()    //ラジオボタンはシート「項目データ」の「0列目」から取得している。
    .setTitle('性別')
    .setChoiceValues(generateArray(dataValues,0))
    .setRequired(true);
  
  form.addTextItem().setTitle('在学、卒業の学校名').setRequired(true);//入力はテキストアイテム

  form.addMultipleChoiceItem()    //ラジオボタンはシート「項目データー」の「1列目」から取得している
    .setTitle('学部')
    .setChoiceValues(generateArray(dataValues,1))
    .showOtherOption(true)//その他の選択肢

  form.addTextItem().setTitle('学科・コース');


  form.addMultipleChoiceItem()    //ラジオボタンはシート「項目データ」の「2列目」から取得している
    .setTitle('卒業・在学の区分')
    .setChoiceValues(generateArray(dataValues,2))
    .showOtherOption(true)//その他の選択肢
    .setRequired(true);


  
  form.addListItem()  //リストアイテムはシート「項目データ」の「3列目」から取得している  
    .setTitle('お住まいの都道府県は?')
    .setChoiceValues(generateArray(dataValues,3))
    .setRequired(true);


  form.addListItem()   //リストアイテムはシート「項目データ」の「3列目」から取得している
    .setTitle('ご出身の都道府県は?')
    .setChoiceValues(generateArray(dataValues,3))
    .setRequired(true);


  form.addCheckboxItem()    //チェックボックスはシート「項目データ」の「4列目」から取得している
    .setTitle('当社を知った媒体はどちらでしょうか。')
    .setChoiceValues(generateArray(dataValues,4))
    .showOtherOption(true)//その他の選択肢
    .setRequired(true);


  //以下、スケールアイテム
  
  form.addScaleItem()
    .setTitle('講師の声の聞き取りやすさ     1: 全く良くない  〜  5: 大変良い')
    .setBounds(1,5)
    .setRequired(true);


  form.addScaleItem()
    .setTitle('講師の説明の分かりやすさ     1: 全く分からない  〜  5: 大変分かりやすい')
    .setBounds(1,5)
    .setRequired(true);


  form.addScaleItem()
    .setTitle('スタッフの身だしなみ     1: 全く良くない  〜  5: 大変良い')
    .setBounds(1,5)
    .setRequired(true);

  form.addScaleItem()
    .setTitle('スタッフの対応    1: 全く良くない  〜  5: 大変良い')
    .setBounds(1,5)
    .setRequired(true);


    form.addScaleItem()
    .setTitle('当社志望度    1: 低い  〜  5: 高い')
    .setBounds(1,5)
    .setRequired(true);



  form.addParagraphTextItem().setTitle('ご意見ご要望');//段落テキストアイテム
  

  
  //ここの4行ををコメントアウトすることで、マイドライブに保存が出来る。
  //フォームを指定のドライブに保存する
  const id=PropertiesService.getScriptProperties().getProperty('FOLDER_ID');//格納するフォルダIDを取り出す
  const formFile=DriveApp.getFileById(form.getId());//作成したフォームをオブジェクトとして取得
  DriveApp.getFolderById(id).addFile(formFile);//指定のフォルダにFileオブジェクトを追加する
  DriveApp.getRootFolder().removeFile(formFile);//マイフォルダからFileオブジェクトを削除する
  

}


//フォームを保存したいドライブのIDを指定して、1番最初に実行する。
function setScriptProperty(){
  PropertiesService.getScriptProperties().setProperty('FOLDER_ID','XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
}

//プロパティストアにフォルダIDが格納されたことを確認する
function getScriptProperty(){
  const folderid=PropertiesService.getScriptProperties().getProperty('FOLDER_ID');
  console.log(folderid);

}

あとはスプレッドシートのトップ画面のボタンの右上3点リーダーからスクリプトを「pushButton」に割り当てて押すと、あなたが指定したフォルダ、または上記4行をコメントアウトした場合はマイドライブに保存されます。

お疲れ様でした、ブレイクタイムフォトはこちらになります。

恵比寿ガーデンプレイス、フランスのクリスタルメーカー、バカラのシャンデリア。
カメラはOLYMPUSのミラーレス一眼。

この写真ムービーは、下記の記事でご覧になれます。

恵比寿ガーデンプレイス、バカラのシャンデリア

■参考文献の紹介■
初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。

GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本を通してじっくり学べます。

サイトマップはこちらから

GASサンプル集に戻る
メインメニューに戻る
これからプログラミングを始める方へ
基本情報技術者へ
自己紹介

ねこフォーム実践編2プログラミングアンケートに進む→

<ねこフォーム7>ねこあつめフォームに「プルダウンリスト」を追加する

この記事では、GAS(Google Apps script)でねこあつめフォームに「プルダウンリスト」を追加します。
また、ラジオボタンや、チェックボックスも、スプレッドシートからデータを取得してフォームに表示出来るように致します。

お世話になっているサイトは、いつも隣にITのお仕事さんの

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

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

です。

まずは、前回のおさらいをします。
チェックボックスを追加するのに、下記のコードを追加しました。

//←チェックボックスを追加する
  form.addCheckboxItem()
    .setTitle('種類は何系?(チェックボックス)')
    .setChoiceValues(['みけ','とら']) 
    .showOtherOption(true)//その他のチェックボックスを作っている
    .setRequired(true); 

実行して、プレビュー画面です。

前回のコードのまとめです。

function myFunction() {

  //SpreadsheetAppから現在のスプレッドシートにアクセス
  const ss=SpreadsheetApp.getActiveSpreadsheet();

  //シート名「イベント概要」のデータを配列として取得する
  const values=ss.getSheetByName('イベント概要').getDataRange().getValues();
  const formTitle=values[0][1];//タイトル
  const formDescription=values[1][1];//概要
  
  //フォームを作成
  const form=FormApp.create(formTitle);

  //ここでプロパティストアに格納したFOLDER_IDを使って、指定のフォルダにフォームを作成する
  const id=PropertiesService.getScriptProperties().getProperty('FOLDER_ID');//idにFOLDER_IDを格納する
  const formFile=DriveApp.getFileById(form.getId());//作成したフォームのIDをformFileに格納する
  DriveApp.getFolderById(id).addFile(formFile);//指定のフォルダにフォームを格納する
  DriveApp.getRootFolder().removeFile(formFile);//マイドライブに作成されたフォームを削除する

  //フォームの説明を作成
  form.setDescription(formDescription);

  //テキストアイテムを追加する
  form.addTextItem().setTitle('おなまえ').setRequired(true);//trueにすることで、入力必須にしている。
  form.addTextItem().setTitle('あそんだグッズ');

  //メールアドレスのテキストアイテムを加える
  const validationEmail=FormApp.createTextValidation().requireTextIsEmail().build();
  form.addTextItem().setTitle('めあど').setRequired(true).setValidation(validationEmail);

  //ラジオボタンを加える
  form.addMultipleChoiceItem()
    .setTitle('種類は何系?(ラジオボタン)')
    .setChoiceValues(['みけ','とら'])
    .setRequired(true);

  //←チェックボックスを追加する
  form.addCheckboxItem()
    .setTitle('種類は何系?(チェックボックス)')
    .setChoiceValues(['みけ','とら']) 
    .showOtherOption(true)//その他のチェックボックスを作っている
    .setRequired(true); 

}

今回の内容に入る前に、ねこあつめ画像に癒されます。
紙袋に入った、「赤毛ねこのアンちゃんのお尻」が可愛すぎて反則なぐらいです(=^x^=)

さて、今回はスプレッドシートからデータを取得して、フォームのアイテムに反映させて、リストアイテムも新たに作ります。

スプレッドシートは、この2枚を用意します。

フォームを作成するのに使う「イベント概要」は、今まで通りこのように配置しています。

また、フォームに追加するアイテムは、シート「項目データ」にこのように配置しています。

猫ちゃん達の出身地は47都道府県なので、それを全部コードにベタ打ちするのは大変です。なので、スプレッドシートから取得するように致します。
この都道府県リストは総務省統計局さんの「2-2 都道府県別人口と人口増減率」のExcelからコピーして頂きました。

今回作成するねこあつめフォームの、「なまえ」、「1番お気に入りのグッズ」、「めあど」はプログラムからテキストアイテムを作って、上記のスプレッドシートからは、

・A列(ラジオボタン)・・・ねこ種類「みけ、とら、その他」を選択
・B列(チェックボックス)・・・他にあそんだことのあるグッズ「まるこたつ、ゆたんぽ・・・」などのグッズをチェックします。
・C列(リストアイテム)・・・ねこちゃん達の出身地を「北海道・・・沖縄」まで、プルダウンリストで選択します。

また、スプレッドシートのデータを二次元配列として取得する為、下記のコードを加えます。最初の行はタイトルなので、shift()を使って取り除いています。

//シート「項目データ」から、フォームに追加するアイテムの内容を二次元配列として取得する
  const dataValues=ss.getSheetByName('項目データ').getDataRange().getValues();
  dataValues.shift();

この二次元配列dataValuesと列数を渡すことで、その列のデータを一次元配列として取得する関数を作成しました

/**
   * シート「項目データ」の値を二次元配列として取得して、指定の列を抜き出し一次元配列を構成する
   * 
   * @param{Object[][]}シート「項目データ」を二次元配列として取得したデータ
   * @param{number} 配列の列数(0以上のインデックス)
   * @return{Object[]} 指定の列の見出しタイトル行を除くデータによる一次元配列
   * 
   */
  function generateArray(values,column){
    return values.map(record=>record[column]).filter(value=>value);
  }

関数の呼び出しは、A列の「ねこ種類」の場合は、

generateArray(dataValues,0)

と記述し、引数に二次元配列のデータと列数を指定することで「ねこ種類」が呼び出せます。

B列の「他にあそんだことのあるグッズ」の呼び出しは、

generateArray(dataValues,1)

で、

C列の「全国のねこちゃんたちの都道府県」は

generateArray(dataValues,2)

と記述して、関数を呼び出して二次元配列から一次元配列にします。

このgenerateArray関数は、「map」を使うことで、スプレッドシートのデータが二次元配列の状態で格納されているのを一次元配列にして、フォームで選択出来る形に変換しています。

また、filterを使うことで、列に含まれる空のデータを取り除くことが出来ます。
例えばA列でしたら、「みけ、とら、その他」の後は空白です。
そこでfilterを使って、データがある「みけ、とら」のみを取得してフォームで使うことが出来る様になります。

以上をまとめたコードはこちらです。

function myFunction() {

  //SpreadsheetAppから現在のスプレッドシートにアクセス
  const ss=SpreadsheetApp.getActiveSpreadsheet();

  //シート名「イベント概要」のデータを配列として取得する
  const values=ss.getSheetByName('イベント概要').getDataRange().getValues();
  const formTitle=values[0][1];//タイトル
  const formDescription=values[1][1];//概要
  
  //フォームを作成
  const form=FormApp.create(formTitle);


  //ここでプロパティストアに格納したFOLDER_IDを使って、指定のフォルダにフォームを作成する
  const id=PropertiesService.getScriptProperties().getProperty('FOLDER_ID');//idにFOLDER_IDを格納する
  const formFile=DriveApp.getFileById(form.getId());//作成したフォームのIDをformFileに格納する
  DriveApp.getFolderById(id).addFile(formFile);//指定のフォルダにフォームを格納する
  DriveApp.getRootFolder().removeFile(formFile);//マイドライブに作成されたフォームを削除する


  //フォームの説明を作成
  form.setDescription(formDescription);

  //テキストアイテムを追加する
  form.addTextItem().setTitle('おなまえ').setRequired(true);//trueにすることで、入力必須にしている。
  form.addTextItem().setTitle('1番お気に入りのグッズ');


  //メールアドレスのテキストアイテムを加える
  const validationEmail=FormApp.createTextValidation().requireTextIsEmail().build();
  form.addTextItem().setTitle('めあど').setRequired(true).setValidation(validationEmail);


  //←シート「項目データ」から、フォームに追加するアイテムの内容を二次元配列として取得する
  const dataValues=ss.getSheetByName('項目データ').getDataRange().getValues();
  dataValues.shift();

  /**
   * シート「項目データ」の値を二次元配列として取得して、指定の列を抜き出し一次元配列を構成する
   * 
   * @param{Object[][]}シート「項目データ」を二次元配列として取得したデータ
   * @param{number} 配列の列数(0以上のインデックス)
   * @return{Object[]} 指定の列の見出しタイトル行を除くデータによる一次元配列
   * 
   */
  function generateArray(values,column){
    return values.map(record=>record[column]).filter(value=>value);
  }
  
  
  //ラジオボタンを加える
  form.addMultipleChoiceItem()
    .setTitle('ねこ種類')
    .setChoiceValues(generateArray(dataValues,0))
    .setRequired(true);

  //チェックボックスを追加する
  form.addCheckboxItem()
    .setTitle('他にあそんだグッズ')
    .setChoiceValues(generateArray(dataValues,1)) 
    .showOtherOption(true)//その他のチェックボックスを作っている
    .setRequired(true); 

  //←リストアイテムを追加する
  form.addListItem()
    .setTitle('ねこちゃんの都道府県')
    .setChoiceValues(generateArray(dataValues,2)) 
    .setRequired(true); 

}

このコードを実行した結果です。

シート「イベント概要」からは、フォームのタイトルと説明を取得しました。

シート「項目データ」からは、これらのアイテムを取得しました。

■参考文献の紹介■
初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。

GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本を通してじっくり学べます。

サイトマップはこちらから

GASサンプル集に戻る
メインメニューに戻る
これからプログラミングを始める方へ
基本情報技術者へ
自己紹介

←前に戻るにゃん        次行くにゃん

GASで「ねこあつめ」のコードにドキュメンテーションコメントを追加する「ねこあつめシリーズその16(最終回)」

この記事では、GAS(Google Apps Script)で「ねこあつめ」をChatworkに送信する為に今まで書いてきたコードに、ドキュメンテーションコメントを追加します。

お世話になった記事は、いつも隣にITのお仕事さん

【初心者向けGAS】Google Apps Scriptのドキュメンテーションコメントの書き方

です。

今回の内容に入る前に、前回の復習をします。
前回はスプレッドシートの猫ちゃんの「なまえ」〜「とくちょう」をChatworkに送る時にメッセージを装飾しました。

Chatworkに送るスプレッドシートです。

実際に送った画像です。

前回のコードです。

//メインの関数でAmazonにDVDの注文をする
function myFunction() {
  const ss = SpreadsheetApp.getActiveSheet();
  let lastRow = ss.getLastRow();//最終行を取得
  const token=PropertiesService.getScriptProperties().getProperty('CW_TOKEN');//←ここを追加

  for (let i = 2; i <= lastRow; i++) {

    //もしもD列の「済」が空白だったらA列の「なまえ」を出力してD列を「済」にする
    if (!ss.getRange(i, 4).getValue()) {
      let cat=ss.getRange(i,1,1,3).getValues();//←配列catで一気に1行3列分のデータを取得する ※getValue[s]でsが付く

      //AmazonがDVDの注文を受け取る
      let body='[info]';  //←ここで、囲い枠線で装飾する
      body+=cat[0][0]+'[hr]';//←A列:猫ちゃんの「なまえ」に水平線を入れる
      body+=cat[0][1]+'\n';//B列:猫ちゃんの「しゅるい」
      body+='('+cat[0][2]+')[/info]';//←C列:猫ちゃんの「とくちょう」を送ったら囲い枠線を閉じる
      
      //ここでAmazonが宅配業者みたいなsendMessage関数にDVDの配達を依頼する
      sendMessage(token,body);
      ss.getRange(i, 4).setValue('済');

      //もしも最終行以上になったらセル範囲を消去する
      if (i >= lastRow) {
        ss.getRange(2, 4, lastRow - 1).clearContent();
      }
      break;
    }
  }
}

//宅配業者のようなsendMessage関数がAmazonからDVDを受け取って、配達を行う
function sendMessage(token,body){
  const cw=ChatWorkClient.factory({token:token}); //←APIトークンの所をtokenに置き換える
  cw.sendMessageToMyChat(body);
}

今回の内容に入る前に、ねこあつめ画像で癒されます。

雪の日のねこあつめ

さて、今回の内容に入ります。

今まで作ってきたコードの関数を、後で見返したり、誰かにコードを見てもらう時に分かりやすくする為に、ドキュメンテーションコメントという、関数を説明する為のコメントを書いて行きます。

ドキュメンテーションコメントは「/」で始まって「*/」で終わります。

引数を@param、戻り値を@returnとして、型を指定します。
今回のコードの32行目〜38行目までドキュメンテーションコメントが入っています。

//メインの関数でAmazonにDVDの注文をする
function myFunction() {
  const ss = SpreadsheetApp.getActiveSheet();
  let lastRow = ss.getLastRow();//最終行を取得
  const token=PropertiesService.getScriptProperties().getProperty('CW_TOKEN');//←ここを追加

  for (let i = 2; i <= lastRow; i++) {

    //もしもD列の「済」が空白だったらA列の「なまえ」を出力してD列を「済」にする
    if (!ss.getRange(i, 4).getValue()) {
      let cat=ss.getRange(i,1,1,3).getValues();//←配列catで一気に1行3列分のデータを取得する ※getValue[s]でsが付く

      //AmazonがDVDの注文を受け取る
      let body='[info]';  //ここで、囲い枠線で装飾する
      body+=cat[0][0]+'[hr]';//A列:猫ちゃんの「なまえ」に水平線を入れる
      body+=cat[0][1]+'\n';//B列:猫ちゃんの「しゅるい」
      body+='('+cat[0][2]+')[/info]';//C列:猫ちゃんの「とくちょう」を送ったら囲い枠線を閉じる
      
      //ここでAmazonが宅配業者みたいなsendMessage関数にDVDの配達を依頼する
      sendMessage(token,body);
      ss.getRange(i, 4).setValue('済');

      //もしも最終行以上になったらセル範囲を消去する
      if (i >= lastRow) {
        ss.getRange(2, 4, lastRow - 1).clearContent();
      }
      break;
    }
  }
}

/**
 * 
 * チャットワークのマイチャットにスプレッドシートの「ねこあつめ」のメッセージを送信する
 * 
 * @param{string} token - チャットワークAPIトークン
 * @param{string} body - スプレッドシートのチャットワークに送信するメッセージ本文
 */

//宅配業者のようなsendMessage関数がAmazonからDVDを受け取って、配達を行う
function sendMessage(token,body){
  const cw=ChatWorkClient.factory({token:token}); //←APIトークンの所をtokenに置き換える
  cw.sendMessageToMyChat(body);
}

今まで通り送れました。因みに今日は大晦日です。

ご精読ありがとうございました。

■参考文献の紹介■
初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。

GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本を通してじっくり学べます。

サイトマップはこちらから

GASサンプル集に戻る
メインメニューに戻る
これからプログラミングを始める方へ
基本情報技術者へ
自己紹介

←前に戻るにゃん

GASで「ねこあつめ」をChatworkにメッセージを装飾して送る「ねこあつめシリーズその15」

この記事では、GAS(Google Apps Script)で「ねこあつめ」をChatworkに送信する時に、メッセージを装飾して送る方法を掲載しています。

お世話になった記事は、いつも隣にITのお仕事さんの

【初心者向けGAS】チャットワークのメッセージ記法でBot送信するメッセージを装飾する方法

です。

今回の内容に入る前に、前回の復習をします。
前回はスプレッドシートの猫ちゃんの「なまえ」〜「とくちょう」までを配列として取得して、Chatworkに送ることによって、スプレッドシートのアクセス回数を格段に減らせました。

こちらのスプレッドシートです。

このスプレッドシートを元に、Chatworkに出力した画像とコードです。

//メインの関数でAmazonにDVDの注文をする
function myFunction() {
  const ss = SpreadsheetApp.getActiveSheet();
  let lastRow = ss.getLastRow();//最終行を取得
  const token=PropertiesService.getScriptProperties().getProperty('CW_TOKEN');//←ここを追加

  for (let i = 2; i <= lastRow; i++) {

    //もしもD列の「済」が空白だったらA列の「なまえ」を出力してD列を「済」にする
    if (!ss.getRange(i, 4).getValue()) {
      let cat=ss.getRange(i,1,1,3).getValues();//←配列catで一気に1行3列分のデータを取得する ※getValue[s]でsが付く

      //AmazonがDVDの注文を受け取る
      let body="";  //←ここで、bodyにA列、B列、C列のデータを追加していくので、bodyをletで変数として宣言
      body+=cat[0][0]+'\n';//A列:猫ちゃんの「なまえ」
      body+=cat[0][1]+'\n';//B列:猫ちゃんの「しゅるい」
      body+=cat[0][2]+'\n';//C列:猫ちゃんの「とくちょう」
      
      //ここでAmazonが宅配業者みたいなsendMessage関数にDVDの配達を依頼する
      sendMessage(token,body);
      ss.getRange(i, 4).setValue('済');

      //もしも最終行以上になったらセル範囲を消去する
      if (i >= lastRow) {
        ss.getRange(2, 4, lastRow - 1).clearContent();
      }
      break;
    }
  }
}

//宅配業者のようなsendMessage関数がAmazonからDVDを受け取って、配達を行う
function sendMessage(token,body){
  const cw=ChatWorkClient.factory({token:token}); //←APIトークンの所をtokenに置き換える
  cw.sendMessageToMyChat(body);
}

今回の内容に入る前に、ねこあつめ画像で癒されます。

さて、今回の内容に入ります。

Chatworkにメッセージを送る際にタグを使って、メッセージを装飾します。
角カッコを使った、「メッセージ記法」という書き方を使ってコードを書いて行きます。

ここでは、メッセージを[info]というタグを使って囲い始め、水平の線を[HR]というタグで挿入して、丸カッコを使って体裁を整えて、[/info]で閉じます。

タグは、シングルクォーテーションで囲います。
「/」は、バックスラッシュではなく、普通のスラッシュです。

下記のコードで、14行目から17行目までにタグを入れてコメントを付けました。

//メインの関数でAmazonにDVDの注文をする
function myFunction() {
  const ss = SpreadsheetApp.getActiveSheet();
  let lastRow = ss.getLastRow();//最終行を取得
  const token=PropertiesService.getScriptProperties().getProperty('CW_TOKEN');//←ここを追加

  for (let i = 2; i <= lastRow; i++) {

    //もしもD列の「済」が空白だったらA列の「なまえ」を出力してD列を「済」にする
    if (!ss.getRange(i, 4).getValue()) {
      let cat=ss.getRange(i,1,1,3).getValues();//←配列catで一気に1行3列分のデータを取得する ※getValue[s]でsが付く

      //AmazonがDVDの注文を受け取る
      let body='[info]';  //←ここで、囲い枠線で装飾する
      body+=cat[0][0]+'[hr]';//←A列:猫ちゃんの「なまえ」に水平線を入れる
      body+=cat[0][1]+'\n';//B列:猫ちゃんの「しゅるい」
      body+='('+cat[0][2]+')[/info]';//←C列:猫ちゃんの「とくちょう」を送ったら囲い枠線を閉じる
      
      //ここでAmazonが宅配業者みたいなsendMessage関数にDVDの配達を依頼する
      sendMessage(token,body);
      ss.getRange(i, 4).setValue('済');

      //もしも最終行以上になったらセル範囲を消去する
      if (i >= lastRow) {
        ss.getRange(2, 4, lastRow - 1).clearContent();
      }
      break;
    }
  }
}

//宅配業者のようなsendMessage関数がAmazonからDVDを受け取って、配達を行う
function sendMessage(token,body){
  const cw=ChatWorkClient.factory({token:token}); //←APIトークンの所をtokenに置き換える
  cw.sendMessageToMyChat(body);
}

まずは1匹目の猫ちゃん、「ヘキサにゃん」

1匹目の「ヘキサにゃん」が「済」になりました。
他のコ達も送ってみました。

ご精読ありがとうございました。

■参考文献の紹介■
初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。

GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本を通してじっくり学べます。

サイトマップはこちらから

GASサンプル集に戻る
メインメニューに戻る
これからプログラミングを始める方へ
基本情報技術者へ
自己紹介

←前に戻るにゃん    次行くにゃん(=^x^=) <最終回>→

GASで「ねこあつめ」のメッセージを使って、配列に慣れていく「ねこあつめシリーズその14」

この記事では、GAS(Google Apps Script)で「ねこあつめ」をChatworkに送信する時に、配列の取り扱いに慣れて行くことが出来るプログラムの作成を目的としています。

お世話になった記事は、いつも隣にITのお仕事さんの

【初心者向けGAS】スプレッドシートのセル範囲の値を二次元配列として取得して取り扱う方法

です。

今回の内容に入る前に、前回とそれ以前の復習をします。
前回はChatworkを使う際、APIトークンを別領域に格納するのに、プロパティストアを使いました。
また、今までは、下記のようなスプレッドシートを使って、猫ちゃんの名前をChatworkに書き出して、1番右の列を「済」にしてきました。

前回のコードです。

//メインの関数でAmazonにDVDの注文をする
function myFunction() {
  const ss = SpreadsheetApp.getActiveSheet();
  let lastRow = ss.getLastRow();//最終行を取得
  const token=PropertiesService.getScriptProperties().getProperty('CW_TOKEN');//←ここを追加

  for (let i = 2; i <= lastRow; i++) {

    //もしもD列の「済」が空白だったらA列の「なまえ」を出力してD列を「済」にする
    if (!ss.getRange(i, 4).getValue()) {

      //AmazonがDVDの注文を受け取る
      const body=ss.getRange(i, 1).getValue();

      //ここでAmazonが宅配業者みたいなsendMessage関数にDVDの配達を依頼する
      sendMessage(token,body); //←ここに引数tokenを追加する
      ss.getRange(i, 4).setValue('済');

      //もしも最終行以上になったらセル範囲を消去する
      if (i >= lastRow) {
        ss.getRange(2, 4, lastRow - 1).clearContent();
      }
      break;
    }
  }
}

//宅配業者のようなsendMessage関数がAmazonからDVDを受け取って、配達を行う
function sendMessage(token,body){  //←ここの引数にtokenを加える
  const cw=ChatWorkClient.factory({token:token}); //←APIトークンの所をtokenに置き換える
  cw.sendMessageToMyChat(body);
}

今回の内容に入る前に、ねこあつめ画像で癒されます。

さて、今回の内容に入ります。

これまでA列の猫ちゃんの名前を送ってきましたが、B列の「しゅるい」とC列の「とくちょう」は何もしませんでした。
そこで今回はB列、C列も出力して行きます。

13行目のA列の猫ちゃんの名前を格納したbodyの所を変更して、B列やC列のデータも入れるようにします。
下記のコードの13行目から16行目までを追加変更しました。

//メインの関数でAmazonにDVDの注文をする
function myFunction() {
  const ss = SpreadsheetApp.getActiveSheet();
  let lastRow = ss.getLastRow();//最終行を取得
  const token=PropertiesService.getScriptProperties().getProperty('CW_TOKEN');//←ここを追加

  for (let i = 2; i <= lastRow; i++) {

    //もしもD列の「済」が空白だったらA列の「なまえ」を出力してD列を「済」にする
    if (!ss.getRange(i, 4).getValue()) {

      //AmazonがDVDの注文を受け取る
      let body="";  //←ここで、bodyにA列、B列、C列のデータを追加していくので、bodyをletで変数として宣言
      body+=ss.getRange(i,1).getValue()+'\n';
      body+=ss.getRange(i,2).getValue()+'\n';
      body+=ss.getRange(i,3).getValue()+'\n';
      
      //ここでAmazonが宅配業者みたいなsendMessage関数にDVDの配達を依頼する
      sendMessage(token,body);
      ss.getRange(i, 4).setValue('済');

      //もしも最終行以上になったらセル範囲を消去する
      if (i >= lastRow) {
        ss.getRange(2, 4, lastRow - 1).clearContent();
      }
      break;
    }
  }
}

//宅配業者のようなsendMessage関数がAmazonからDVDを受け取って、配達を行う
function sendMessage(token,body){
  const cw=ChatWorkClient.factory({token:token}); //←APIトークンの所をtokenに置き換える
  cw.sendMessageToMyChat(body);
}

このコードを実行することで、A列からC列まで出力されています。

猫ちゃんたちの名前とともに種類や特徴がわかりますね。

ただ、ループでA列、B列、C列のセルを一つ一つ計3回アクセスして取得して、それを4匹分取得すると3×4で12回のアクセスの手間がかかってしまうんです・・・。
なので、配列を使うと便利です。

今回はcatという配列を使います。
下記コードの11行目で配列catを使って、1行3列分一気に格納しますので、getValuesと最後に「s」がついて複数形になっています。

また、スプレッドシートは二次元配列で扱うので、14行目〜16行目のcat[0][0]がA列の「なまえ」、cat[0][1]がB列の「しゅるい」、cat[0][2]がC列の「とくちょう」になっています。

配列は0か始まるので、cat[0]はcatという配列の1行目という意味です。
ループの中でcatには次の猫ちゃんの名前が入るので、配列catの1行目に次々と猫ちゃんデータが格納されるイメージです。

//メインの関数でAmazonにDVDの注文をする
function myFunction() {
  const ss = SpreadsheetApp.getActiveSheet();
  let lastRow = ss.getLastRow();//最終行を取得
  const token=PropertiesService.getScriptProperties().getProperty('CW_TOKEN');//←ここを追加

  for (let i = 2; i <= lastRow; i++) {

    //もしもD列の「済」が空白だったらA列の「なまえ」を出力してD列を「済」にする
    if (!ss.getRange(i, 4).getValue()) {
      let cat=ss.getRange(i,1,1,3).getValues();//←配列catで一気に1行3列分のデータを取得する ※getValue[s]でsが付く

      //AmazonがDVDの注文を受け取る
      let body="";  //←ここで、bodyにA列、B列、C列のデータを追加していくので、bodyをletで変数として宣言
      body+=cat[0][0]+'\n';//A列:猫ちゃんの「なまえ」
      body+=cat[0][1]+'\n';//B列:猫ちゃんの「しゅるい」
      body+=cat[0][2]+'\n';//C列:猫ちゃんの「とくちょう」
      
      //ここでAmazonが宅配業者みたいなsendMessage関数にDVDの配達を依頼する
      sendMessage(token,body);
      ss.getRange(i, 4).setValue('済');

      //もしも最終行以上になったらセル範囲を消去する
      if (i >= lastRow) {
        ss.getRange(2, 4, lastRow - 1).clearContent();
      }
      break;
    }
  }
}

//宅配業者のようなsendMessage関数がAmazonからDVDを受け取って、配達を行う
function sendMessage(token,body){
  const cw=ChatWorkClient.factory({token:token}); //←APIトークンの所をtokenに置き換える
  cw.sendMessageToMyChat(body);
}

配列を使うことによって、各回3回分のアクセスを1回(11行目)に減らせました。
なので、今まで各回3×4=12回だったのが、配列catを用いることで、各回1×4=4回のスプレッドシートのアクセスに減らせました。

ご精読ありがとうございました。

■参考文献の紹介■
初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。

GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本を通してじっくり学べます。

サイトマップはこちらから

GASサンプル集に戻る
メインメニューに戻る
これからプログラミングを始める方へ
基本情報技術者へ
自己紹介

←前に戻るにゃん    次行くにゃん(=^x^=)→

GASで「ねこあつめ」ChatworkのAPIトークンをプロパティストアに格納して使う「ねこあつめシリーズその13」

この記事では、GAS(Google Apps Script)で「ねこあつめ」を一定時間間隔にChatworkに送信した時に使ったAPIトークンをプロパティストアと言うもので管理して、別領域に格納することを実践致します。
お世話になった記事は、いつも隣にITのお仕事さんの

【初心者向けGAS】プロパティストアの概要とスクリプトプロパティの入力方法

と、

【初心者向けGAS】スクリプトプロパティを操作してそのデータを取り出す方法

です。

今回の内容に入る前に、前回の復習をします。

1分置きにねこあつめの猫ちゃんの名前を送る「トリガー」を使いました。エディターの「目覚まし時計マーク」を押して、トリガーを設定しました。

Chatworkに実際に送られたメッセージです。

このメッセージの元になっているのが、下記のスプレッドシートで、これらのコードはこのスプレッドシートにバインドして書いていっています。

今回の内容に入る前に、ねこあつめ画像で癒されます。

さて、今回の内容に入ります。今まで、Chatworkに送る時に、

token:’XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’の所に、ChatworkのマイチャットのAPIトークンをそのまま打っていました。

この’XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’の所を別の領域に格納する為に、「プロパティストア」を使います。

‘XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’の代わりに例えば’CW_TOKEN’などの文字列を使って処理を施すことが可能になります。

そうすることによって、APIトークンをネットで晒すことを防げます。

//ChatworkのAPIトークンをCW_TOKENに格納
function setScriptPropaty(){
  PropertiesService.getScriptProperties().setProperty('CW_TOKEN','XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
}

このコードで、’XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’を’CW_TOKEN’として扱うことが出来ます。

実行結果は、このように、何も実行されていません。

確認のため、下記のコードで’CW_TOKEN’に’XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’が格納されていることがログ出力致します。

//プロパティストアを使ってCW_TOKENにAPIトークンが格納されたことを確認する
function logToken(){
  const token=PropertiesService.getScriptProperties().getProperty('CW_TOKEN');
  console.log(token);  
}

この、モザイクの所に、APIトークンが入っています。

では、今まで作ってきたこのコードに修正を致します。
これまでのコードです。

//メインの関数でAmazonにDVDの注文をする
function myFunction() {
  const ss = SpreadsheetApp.getActiveSheet();
  let lastRow = ss.getLastRow();//最終行を取得

  for (let i = 2; i <= lastRow; i++) {

    //もしもD列の「済」が空白だったらA列の「なまえ」を出力してD列を「済」にする
    if (!ss.getRange(i, 4).getValue()) {

      //AmazonがDVDの注文を受け取る
      const body=ss.getRange(i, 1).getValue();

      //ここでAmazonが宅配業者みたいなsendMessage関数にDVDの配達を依頼する
      sendMessage(body);
      ss.getRange(i, 4).setValue('済');

      //もしも最終行以上になったらセル範囲を消去する
      if (i >= lastRow) {
        ss.getRange(2, 4, lastRow - 1).clearContent();
      }
      break;
    }
  }
}

//宅配業者のようなsendMessage関数がAmazonからDVDを受け取って、配達を行う
function sendMessage(body){
  const cw=ChatWorkClient.factory({token:'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'});
  cw.sendMessageToMyChat(body);
}

4行目の「let lastRow = ss.getLastRow();//最終行を取得」の後に

const token = PropertiesService.getScriptProperties().getProperty(‘CW_TOKEN’);

を加えます。最後の’CW_TOKEN’の所に’XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’が入っています。

それらを定数tokenに代入しています。

宅配業者のようなsendMeessageの呼び出しの所に、bodyの前にtokenを加えて、呼び出した先の仮引数にも加えています。
メイン関数の引数を、「DVDを渡すもの」だとしたら、宅配業者の様なsendMessage関数の仮引数は「DVDを受け取るもの」というイメージだとプログラムの流れが掴みやすいと思います。

また、29行目の所の’XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’を「token」で置き換えています。

下記のコードで、追記変更した所に「←コメント」を追加しています。

//メインの関数でAmazonにDVDの注文をする
function myFunction() {
  const ss = SpreadsheetApp.getActiveSheet();
  let lastRow = ss.getLastRow();//最終行を取得
  const token=PropertiesService.getScriptProperties().getProperty('CW_TOKEN');//←ここを追加

  for (let i = 2; i <= lastRow; i++) {

    //もしもD列の「済」が空白だったらA列の「なまえ」を出力してD列を「済」にする
    if (!ss.getRange(i, 4).getValue()) {

      //AmazonがDVDの注文を受け取る
      const body=ss.getRange(i, 1).getValue();

      //ここでAmazonが宅配業者みたいなsendMessage関数にDVDの配達を依頼する
      sendMessage(token,body); //←ここに引数tokenを追加する
      ss.getRange(i, 4).setValue('済');

      //もしも最終行以上になったらセル範囲を消去する
      if (i >= lastRow) {
        ss.getRange(2, 4, lastRow - 1).clearContent();
      }
      break;
    }
  }
}

//宅配業者のようなsendMessage関数がAmazonからDVDを受け取って、配達を行う
function sendMessage(token,body){  //←ここの引数にtokenを加える
  const cw=ChatWorkClient.factory({token:token}); //←APIトークンの所をtokenに置き換える
  cw.sendMessageToMyChat(body);
}

APIトークンの’XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’を晒すこと無く、今までと同様に動作します。

ご精読ありがとうございました。

■参考文献の紹介■
初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。

GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本を通してじっくり学べます。

サイトマップはこちらから

GASサンプル集に戻る
メインメニューに戻る
これからプログラミングを始める方へ
基本情報技術者へ
自己紹介

←前に戻るにゃん    次行くにゃん(=^x^=)→