質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Google スライド

Google スライドは、Google社が提供している文書作成ツール。Googleアカウントがあれば利用が可能です。プレゼンテーション用テンプレートフォーマットやフォントなどが多く用意されています。

解決済

TypeError: Cannot read property 'getLastRow' of nullと出てしまいます

pompomsinga
pompomsinga

総合スコア1

Google スライド

Google スライドは、Google社が提供している文書作成ツール。Googleアカウントがあれば利用が可能です。プレゼンテーション用テンプレートフォーマットやフォントなどが多く用意されています。

1回答

0評価

0クリップ

4257閲覧

投稿2021/01/20 11:50

前提・実現したいこと

GASを使って定員のある選択肢の作成をしたいです。

発生している問題・エラーメッセージ

TypeError: Cannot read property 'getLastRow' of null updateForm @ コード.gs:44

該当のソースコード

//// // 【基本設定】 // ここを編集するだけで使用できます //// //「https://docs.google.com/spreadsheets/d/xxx/edit」のxxxを入れてください var spreadSheetID = '1B2cJykvvhUDHFJQNmjuaSPovdBZzmdQd7dJxpe99eH4'; // 候補日と定員を書くシート名 var sheetName = '時間'; // 回答のシート名 var answerSheetName = 'フォームの回答'; // 定員のある項目の名前 var questionName = 'ご希望の時間帯をお選びください。'; //// // 【フォームを更新する関数】 //// function updateForm(){ //// // 【スプレッドシートの情報を取得】 // 候補と定員を取得し、定員に満たない候補のみを取得します //// // スプレッドシートをIDで取得 var sheets = SpreadsheetApp.openById(spreadSheetID); // 候補と回答のシートを取得 var sheet = sheets.getSheetByName(sheetName); var answerSheet = sheets.getSheetByName(answerSheetName); // 候補のシートのA行の2行目から下の値を配列で取得する var sheetLastRow = sheet.getLastRow(); if (sheetLastRow > 1) { // 候補と定員を取得 var candidate = sheet.getRange(2, 1, sheetLastRow - 1, 2).getValues(); } else { return; } // 回答のシートの2行目から下の値を配列で取得する var answerSheetLastRow = answerSheet.getLastRow(); if (answerSheetLastRow > 1) { var questionNames = answerSheet.getRange(1, 1, 1, answerSheet.getLastColumn()).getValues(); var colCount = questionNames[0].indexOf(questionName); // 必要な部分だけ取得 var answerData = answerSheet.getRange(2, colCount + 1, answerSheetLastRow - 1).getValues(); } //// // 【Googleフォームの選択肢の上書き】 //// // フォームの取得 var form = FormApp.getActiveForm(); // 質問項目をすべて取得 var items = form.getItems(); // 選択肢の作成、更新 items.forEach(function(item){ // 質問項目がquestionNameの項目を探す if(item.getTitle() === questionName){ var listItemQuestion = item.asListItem(); // 選択肢を入れる配列 var choices = []; // 候補日を一つ一つ見ていく // nameAndCapacity[0]が候補日、nameAndCapacity[1]がその定員 candidate.forEach(function(nameAndCapacity){ if(nameAndCapacity[0] != ""){ // 定員無制限かどうか。また、回答が一件もない場合もこっち if (answerData == null || nameAndCapacity[1] == 0 || nameAndCapacity[1] == ""){ choices.push(listItemQuestion.createChoice(nameAndCapacity[0])); } else { // 定員がある場合は定員以上になっていないか確認 var counter = 0; // 何人分キャパが埋まっているかカウント for(var i = 0; i < answerData.length; i++){ if (nameAndCapacity[0] == answerData[i]){ counter++; } } // まだキャパがあれば選択肢に追加 if (counter < nameAndCapacity[1]){ choices.push(listItemQuestion.createChoice(nameAndCapacity[0])); } } } }); if (choices.length > 0) { // フォームの回答を受け付ける form.setAcceptingResponses(true); // 選択肢を上書き listItemQuestion.setChoices(choices); } else { // 満員につき、回答受付終了 form.setAcceptingResponses(false); } return; } }); }

試したこと

色々調べてみたのですが、解決方法が見つかりませんでした。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Google スライド

Google スライドは、Google社が提供している文書作成ツール。Googleアカウントがあれば利用が可能です。プレゼンテーション用テンプレートフォーマットやフォントなどが多く用意されています。