- 繰り返し処理
- for構文(JavaScript)
前回までで、Googleformの項目を取り込んでスプレッドシートに書き込む道筋が出来上がりました。
前回のコード
function myFunction() { // フォームを開く const form = FormApp.openByUrl(フォームのURL); // URLは'https://docs.google.com/fo******/edit'のように''で囲んで入力 //フォームの要素を配列で取得 const items = form.getItems(); const itemparts = items[0]; //itemという配列の0番目の要素をitempartsとして取り出す。 const itemType = itemparts.getType(); //取得したitempartsのタイプを確認してitemTypeに保管 const itemText = itemparts.getTitle();//取得したitempartsの質問内容を確認してitemTextに保管 //スプレッドシートを開く。 const spsheet = SpreadsheetApp.openByUrl(シートのURL); // URLは'https://docs.google.com/fo******/edit'のように''で囲んで入力 const sheet = spsheet.getActiveSheet(); //処理を加えるシートとして、ファイルを開いて最初に表示される(アクティブな)シートを設定 sheet.clear(); //シートの内容をクリア //シートに行を追加し、formタイトル入力 sheet.appendRow(['フォームタイトル', form.getTitle()]); // 項目タイトル行を作成 sheet.appendRow(['アイテムタイプ', '質問内容']); sheet.appendRow([itemType, itemText]); // フォームの内容を入力 }
ただし、このコードでは、取得した項目のうち、最初の項目だけしか読み込むことができません。
ここ↓の部分ですね。
//フォームの要素を配列で取得 const items = form.getItems(); const itemparts = items[0]; //itemという配列の0番目の要素をitempartsとして取り出す。 const itemType = itemparts.getType(); //取得したitempartsのタイプを確認してitemTypeに保管 const itemText = itemparts.getTitle();//取得したitempartsの質問内容を確認してitemTextに保管
この[0]の部分を1,2,3,・・・・と項目数の数だけ数字を変えて繰り返す必要があります。これが、いわゆる「繰り返し処理」というものになります。
JavaScriptの繰り返し処理について詳しくはChatGPTにでも聞いてみてください。
ここでは繰り返しのうちの一つである、「for」を使います。forを使うと、指定の回数だけカッコ内の処理を繰り返し行うことができます。
つまり、取得したItemの数だけ繰り返してね、という命令を書けば良いと。
では、Itemの数をどうやって知ればよいか?
getなんたらでitem数が返ってくるようなメソッドでもあればよいのですが、残念ながら無いようです。
というより、必要無いのです。その代わりに、getItems()で取り込んだ配列の大きさを調べればよいのですから。
Google Apps Scriptで、配列の大きさを調べるメソッドは?
Google Apps Scriptで配列の大きさ(要素数)を調べるには、配列の組み込みメソッドであるlength
を使用します。以下に具体的な使い方を示します。
function checkArraySize() { var myArray = [1, 2, 3, 4, 5]; var arraySize = myArray.length; Logger.log("配列の大きさは: " + arraySize); }
この例では、myArray
という配列の要素数をlength
メソッドを用いて調べ、その結果をarraySize
変数に格納しています。そして、Logger.log
を使って結果をログに表示しています。
上記のコードをGoogle Apps Scriptエディター内で実行すると、ログに”配列の大きさは: 5″と表示されるでしょう。配列の要素数を調べる際には、length
メソッドを使って簡単に取得できます。
相変わらず鮮やか。コードサンプルまで提示してくれるので使いやすい!要するに、items[]の大きさを調べるには、items.lengthとする。
「〇回繰り返す」という命令を書きたかったら「items.length回繰り返す」とすればよいと。
ではそれを踏まえて、必要箇所をItemの個数だけ繰り返すようにコードを書き換えてみます。
//フォームの要素を配列で取得 const items = form.getItems(); for (let i = 0; i < items.length; i++) { //Item数をiと置き換えて、iを0から順番に項目の数だけ1ずつ増やす const itemparts = items[i]; //itemという配列のi番目の要素をitempartsとして取り出す。 const itemType = itemparts.getType(); //取得したitempartsのタイプを確認してitemTypeに保管 const itemText = itemparts.getTitle();//取得したitempartsの質問内容を確認してitemTextに保管 sheet.appendRow([itemType, itemText]); // それぞれシートの新しい行に入力 }
取得したものをすぐにシートに書き込むため、forを始める前にスプレッドシートの準備を整えられるよう、順番を変更します。
function myFunction() { // フォームを開く const form = FormApp.openByUrl(フォームのURL); // URLは'https://docs.google.com/fo******/edit'のように''で囲んで入力 //フォームの要素を配列で取得 const items = form.getItems(); //スプレッドシートを開く。 const spsheet = SpreadsheetApp.openByUrl(シートのURL); // URLは'https://docs.google.com/fo******/edit'のように''で囲んで入力 const sheet = spsheet.getActiveSheet(); //処理を加えるシートとして、ファイルを開いて最初に表示される(アクティブな)シートを設定 sheet.clear(); //シートの内容をクリア //シートに行を追加し、formタイトル入力 sheet.appendRow(['フォームタイトル', form.getTitle()]); // 項目タイトル行を作成 sheet.appendRow(['アイテムタイプ', '質問内容']); for (let i = 0; i < items.length; i++) { //Item数をiと置き換えて、iを0から順番に項目の数だけ1ずつ増やす const itemparts = items[i]; //itemという配列のi番目の要素をitempartsとして取り出す。 const itemType = itemparts.getType(); //取得したitempartsのタイプを確認してitemTypeに保管 const itemText = itemparts.getTitle();//取得したitempartsの質問内容を確認してitemTextに保管 sheet.appendRow([itemType, itemText]); // それぞれシートの新しい行に入力 } }
では、実行してみます。
取得元のフォームはこちら
そして、スプレッドシートに入力された内容がこちら
いい感じです✨
次はいよいよ、アイテムタイプごとに違う処理をする「分岐処理」です。
コメント