解決したいこと
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を指定する際にクォーテーションが必要かと思い、''を追記してみた。
ご教示下さい
シートの指定方法や、エラーの解消に向けてやるべき事などがありましたら教えて頂けますと幸いです。
ご質問をしながら解決方法を探してみますので、わかりましたらご報告をさせて頂きます。
紐づけがどうなっているかは一旦置いておいて、 [この例](https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#openbyurlurl)にしたがって、myFormにopenByUrl()を使って取得した値を入力してみてください。また、'stname'のstnameには、開きたいシートの名前を入れてください。ここでの「シート」は、追加時のデフォルト名が「シート+数値」形式のものを指しています。
お忙しい所、ご回答誠にありがとうございます。
添付頂きましたサイトも参考に修正してみましたが、同じエラーが出てしまいました・・・。
```
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
```
function CreateQuotationByForm() {
var sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var lastRow = sh.getLastRow();
```
という風に書いた所、「TypeError: Cannot read property 'getLastRow' of null」というエラーは解消しましたが、だいぶ文章を消してしまっているので、
google formの内容をスプレッドシートに保存→見積書PDFを自動作成 というプログラムがこのままの内容で出来るのかどうか分からず不安です・・・。
申し訳ありませんが、画像は確認できませんでした。
ちなみに「フォームの回答1」のシートにデータは入っていますか?
ご返信ありがとうございます。
はい、テストでフォームからデータを送信してシートに反映されているものが3行分程ある状態となっております。
ありがとうございます。
もう1点、この関数を実行して、データの最終行の値(3)が実行ログに表示されているかどうかを確認してください。
function test1() {
var sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var lastRow = sh.getLastRow();
Logger.log(lastRow);
}
文字化けのため回答に移しました。
コメントありがとうございます。
エラーが出ているコードを消して、お送り頂いたコードのみを実行した結果
情報 4 と正しく最終行の番号が表示されました。
1行目は項目名になっているので、4行目が情報が入っている最終行となっております。
その場合、目的の値は取得できているということなので、次のステップに進んで大丈夫です。心配な場合は、関数test1内で「sh.getRange(lastRow,1).getValue()」の値もLogger.logで確認してみてください。正しく機能する場合は、最終行の1列目に入った値が表示されるはずです(念の為に、後々にはデバッグ機能の方がおそらく容易だと伝えておきます)。
色々とご解説、誠にありがとうございました。
是非ベストアンサーにさせて頂きたいのですが、どのようにしたら良いでしょうか?
teratailを初めて使ったので、仕組みがよく分かっておらず申し訳ございません。
回答1件
あなたの回答
tips
プレビュー