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

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

新規登録して質問してみよう
ただいま回答率
85.32%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

1回答

261閲覧

TypeError 助けてください

shi._.ol_235

総合スコア0

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

1クリップ

投稿2025/03/07 12:44

実現したいこと

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

発生している問題・分からないこと

TypeError: Cannot read properties of null (reading 'getLastRow')
updateForm @ コード.gs:35

と出てくる。

エラーメッセージ

error

1エラー 2TypeError: Cannot read properties of null (reading 'getLastRow') 3updateForm @ コード.gs:35

該当のソースコード

//// // 【基本設定】 // ここを編集するだけで使用できます //// //「https://docs.google.com/spreadsheets/d/xxx/edit」のxxxを入れてください var spreadSheetID = '1T6cUDHGmAaeE6Ft7FXZU2Tw6l3QkOjPgRGWR9jr5RPs'; // 食物バザー(回答) var sheetName = 'メニュー'; // メニュー var answerSheetName = '個数'; // 個数 var questionName = '個数制限があるものもあります!'; //// // 【フォームを更新する関数】 //// function updateForm() { //// // 【スプレッドシートの情報を取得】 // 候補と定員を取得し、定員に満たない候補のみを取得します //// // スプレッドシートをIDで取得 var sheets = SpreadsheetApp.openById('1T6cUDHGmAaeE6Ft7FXZU2Tw6l3QkOjPgRGWR9jr5RPs'); // 候補と回答のシートを取得 var sheet = sheets.getSheetByName("食物バザー"); 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); if (colCount === -1) { Logger.log("定員のある項目が見つかりません。questionName の値を確認してください"); } // 必要な部分だけ取得 (2次元配列で返ってくるので、flat()で1次元配列に変換しておく) var answerData = answerSheet.getRange(2, colCount + 1, answerSheetLastRow - 1).getValues().flat(); } //// // 【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 || 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; } }); }

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

回答のシートの2行目から下の値を配列で取得する var answerSheetLastRow = answerSheet.getLastRow

と検索しましたが、回答が得られませんでした...どうか助けてください

補足

特になし

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2025/03/08 02:06

「個数」というシートはありますか? answerSheetが取得できているか確認してみてください。
YellowGreen

2025/03/09 12:33

私も同意見です 取得できていないのはanswerSheetかと
guest

回答1

0

var answerSheetLastRow = answerSheet.getLastRow(); if (answerSheetLastRow > 1) { var questionNames = answerSheet.getRange(1, 1, 1, answerSheet.getLastColumn()).getValues(); var colCount = questionNames[0].indexOf(questionName);

このコードについて、answerSheetLastRowが1より大きい時の挙動は記載されていますが、1以下の時の挙動が記載されていません。

エラーの意味合いとしては、getLastRowした内容がNullになっている、つまりanswerSheetLastRowが有効ではない状態になっているというものかと思います。

ですので、
・1以下の時の挙動をif文で追記する
answerSheetLastRowが1以下になる時にはデフォルト値を設定しておく
・answerSheetにダミーデータを一行以上入れておく
これらいずれかの対応をとるとエラーは発生しなくなるかと思います。

投稿2025/03/07 15:29

takumakoike

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.32%

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

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

質問する

関連した質問