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

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

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

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

Q&A

解決済

1回答

3014閲覧

GAS 'getLastRow' of null というエラーについて

HARUNA3

総合スコア2

Google Apps Script

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

0グッド

0クリップ

投稿2021/08/20 03:55

解決したいこと

GASを利用し、googleformから送られてきた値を元に見積書を自動で作るプログラムを作っております。

GAS初学者でして、 下記の通りエラーが出てしまって解決方法が分からずご質問をさせて頂きました。

発生している問題・エラー

TypeError: Cannot read property 'getLastRow' of null CreateQuotationByForm @ コード.gs:10

該当するソースコード

javascript

1var hoge 2var FolderId = hoge 3var mailaddress = hoge 4var stname = "https://フォームと連動しているスプレッドシートのURLを記入" 5 6function CreateQuotationByForm() { 7 var myForm = SpreadsheetApp.getActiveSpreadsheet(); 8 var stForm = myForm.getSheetByName('stname'); 9 var maxRow = stForm.getLastRow(); 10 11 var option = stForm.getRange(maxRow, 14).getValue(); 12 var company = stForm.getRange(maxRow, 15).getValue(); 13 var name = stForm.getRange(maxRow, 16).getValue(); 14 var mail = stForm.getRange(maxRow, 17).getValue(); 15 var phoneNumber = stForm.getRange(maxRow, 18).getValue(); 16

問題の箇所

javascript

1var stForm = myForm.getSheetByName('stname');

自分で試したこと

  • 恐らく、そもそもシートが読み込めておらずnullになってしまっているため getSheetByNameでの指定しているシート名が異なっているのではないかと思い、確認をしました。

→ google formと連動したスプレッドシートである事を確認し、URLを記入した。

  • nameを指定する際にクォーテーションが必要かと思い、''を追記してみた。

ご教示下さい

シートの指定方法や、エラーの解消に向けてやるべき事などがありましたら教えて頂けますと幸いです。
ご質問をしながら解決方法を探してみますので、わかりましたらご報告をさせて頂きます。

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

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

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

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

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

3_April_2021

2021/08/20 08:14

紐づけがどうなっているかは一旦置いておいて、 [この例](https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#openbyurlurl)にしたがって、myFormにopenByUrl()を使って取得した値を入力してみてください。また、'stname'のstnameには、開きたいシートの名前を入れてください。ここでの「シート」は、追加時のデフォルト名が「シート+数値」形式のものを指しています。
HARUNA3

2021/08/20 10:39

お忙しい所、ご回答誠にありがとうございます。 添付頂きましたサイトも参考に修正してみましたが、同じエラーが出てしまいました・・・。 ``` var mailaddress = "hoge@gmail.com" var ss_id = "hogehogehoge" var stname = "フォームの回答1" var FolderId = "hugahugahuga" function CreateQuotationByForm() { var myForm = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/hoge/edit") var stForm = myForm.getSheetByName(stname); var maxRow = stForm.getLastRow(); ``` stnameでつけているシートの名前は、添付の写真のシート名を参考につけていますが間違っていますでしょうか? https://gyazo.com/a27122663e7884b786ee619595f37233
HARUNA3

2021/08/20 10:42

``` function CreateQuotationByForm() { var sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var lastRow = sh.getLastRow(); ``` という風に書いた所、「TypeError: Cannot read property 'getLastRow' of null」というエラーは解消しましたが、だいぶ文章を消してしまっているので、 google formの内容をスプレッドシートに保存→見積書PDFを自動作成 というプログラムがこのままの内容で出来るのかどうか分からず不安です・・・。
3_April_2021

2021/08/20 12:05

申し訳ありませんが、画像は確認できませんでした。 ちなみに「フォームの回答1」のシートにデータは入っていますか?
HARUNA3

2021/08/20 12:13

ご返信ありがとうございます。 はい、テストでフォームからデータを送信してシートに反映されているものが3行分程ある状態となっております。
3_April_2021

2021/08/20 12:33

ありがとうございます。 もう1点、この関数を実行して、データの最終行の値(3)が実行ログに表示されているかどうかを確認してください。 function test1() { var sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var lastRow = sh.getLastRow(); Logger.log(lastRow); }
3_April_2021

2021/08/20 12:39 編集

文字化けのため回答に移しました。
HARUNA3

2021/08/20 12:42

コメントありがとうございます。 エラーが出ているコードを消して、お送り頂いたコードのみを実行した結果 情報 4 と正しく最終行の番号が表示されました。 1行目は項目名になっているので、4行目が情報が入っている最終行となっております。
3_April_2021

2021/08/20 13:11

その場合、目的の値は取得できているということなので、次のステップに進んで大丈夫です。心配な場合は、関数test1内で「sh.getRange(lastRow,1).getValue()」の値もLogger.logで確認してみてください。正しく機能する場合は、最終行の1列目に入った値が表示されるはずです(念の為に、後々にはデバッグ機能の方がおそらく容易だと伝えておきます)。
HARUNA3

2021/08/20 13:15

色々とご解説、誠にありがとうございました。 是非ベストアンサーにさせて頂きたいのですが、どのようにしたら良いでしょうか? teratailを初めて使ったので、仕組みがよく分かっておらず申し訳ございません。
guest

回答1

0

ベストアンサー

詳細な条件の再現も含めて協力する気はなかったたため、回答までする気がありませんでしたが、流れで回答を投稿してしまったため、せめて質問に対する正式な回答に近づけます。

gs

1 var stname = "https://フォームと連動しているスプレッドシートのURLを記入" 2 var stForm = myForm.getSheetByName('stname'); 3 var maxRow = stForm.getLastRow();

URLをstnameに入れるのいいとして、その値はgetSheetByName()で使用される値ではありません。'stname'という指定からはそもそも入れたつもりの値は引き出せません。 メソッドの書き方に関する修正を加えたコードでは、少なくとも「フォームと紐づけ等を行っていないスプレッドシート」の条件では問題の再現ができないことは確認しています。

JavaScriptの基礎、gasを使用したスプレッドシート操作でよく使用すると思われる方向のものを確認してください。後者については易しい書き方の情報もたくさんあるはずです。

投稿2021/08/20 12:38

編集2021/08/21 00:30
3_April_2021

総合スコア48

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

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

HARUNA3

2021/08/20 12:46

コメントありがとうございます。 こちらのコードですと、 「TypeError: Cannot read property 'getLastRow' of null」とやはりエラーとなってしまいました。
HARUNA3

2021/08/20 13:17

3_April_2021 さんより質問の追記・修正で頂きましたアドバイスを元に、解決致しました。 最終的にコードは下記のように変更した所、エラーが改善されました。 ``` function CreateQuotationByForm() { var sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); var lastRow = sh.getLastRow(); ```
3_April_2021

2021/08/21 00:31

test2()は改めて質問本題に対する回答ではないと思ったので編集しました。
3_April_2021

2021/08/21 01:13 編集

内容の誤りを見つけたので後で投稿し直します。
3_April_2021

2021/08/21 01:13 編集

内容の誤りを見つけたので後で投稿し直します。
3_April_2021

2021/08/21 01:34

感謝してもらえるなら、あなたと同じ問題を抱えている閲覧者にとっても役立つページになるような努力を希望したいと思います。 まず、最終的な解決コードから見ても、質問コードの実行を妨げた要因がgetSheetByName()の使用法にあったと考えられることを理解していますか?test2は私の環境で機能するため、このメソッドの使用法に指摘されていない勘違いがある可能性があります。使用条件か書き方のどちらかが問題だと思います。 ちなみに、後者が原因の場合は、たいて、小さな入力ミスです(文字列の指定が完全に一致しない、全角半角など)。後の閲覧者のことを考えると、この指摘されていない部分も可能ならページに残してほしい情報であることを理解できますか? 情報の更新や未解決に戻すことが常に良い効果をもたらすとは限らないので、すでに解決策には達した投稿をどうするかについてこれ以上口を出すつもりはありません。
HARUNA3

2021/08/21 04:24

3_Aprill_2021 様 色々とご指摘やご指南、本当にありがとうございました。 感謝はしておりますが、最終的なコメントの意味が私にはよく理解出来ませんでした。 stnameにシングルクォーテーションをつけた('stname')が不適切である事は書き加えれば良かったです。 今後回答を参考にされる方を意識して投稿したいと思います。
3_April_2021

2021/08/27 02:14

今のあなたに対して過剰な情報を書いていただけです。あなたが行った特定行為を非難する意図はありません。 不快な誤解を与えて失礼しました。 言い換えます。 もししばらくしてこの質問を振り返る機会があって、そのときに書き足すべきだと思う情報があれば追加していただければより嬉しいです。 また、そのときにあなたがそうすべきだと思うなら、あなた自身の回答を投稿したり、最良の回答を再選択したりすることを躊躇しないで貰えると嬉しいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問