LoginSignup
karikura
@karikura (かり くら)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

初心者です)GAS パラメーターエラーの原因がわかりません。

解決したいこと

初心者です。
ユーチューブを参考に、GASをくみましたがエラーとなり原因がわかりません。
やりたいこととしては、QRコードを読み取った際に自動でスプレッドその方のメアドと日付が入るようにしたいです。
どこをどう修正したらいいのかご教示いただけますと幸いです。

<ユーチューブ>
https://www.youtube.com/watch?v=ktsLFxL23H8&t=95s

<実行した際のエラー>
TypeError: Cannot read properties of undefined (reading 'parameter')
doGet @ QRリクエスト.gs:2

<URL(QR)にアクセスした際の表示>
TypeError: Cannot read properties of null (reading 'getLastRow')(行 7、ファイル「QRリクエスト」)

<コード1>
function bihinlabel(){
var sht = SpreadsheetApp.getActive().getSheetByName('発送一覧');
var lastRow = sht.getLastRow();
for (var i=3; i<=lastRow; i++) {
sht.getRange(i, 3).clear();
sht.getRange(i, 4).clear();
var qrc1 = '="https://script.google.com/a/macros/s/\"&$B$1&\"/exec?no=\"&A' + i;
var qrc2 = '=image("https://chart.apis.google.com/chart?chs=250x250&cht=qr&chl=\"&C' + i +')';
sht.getRange(i, 3).setValue(qrc1);
sht.getRange(i, 4).setValue(qrc2);
}
}

<コード2>デプロイするもの
function doGet(e) {
var no = e.parameter.no;
var datetime = new Date();
var today = Utilities.formatDate(datetime,'JST', 'yyyy/MM/dd');
var userid = Session.getActiveUser().getEmail();
var sht = SpreadsheetApp.getActiveSpreadsheetApp().getSheetByName('発送一覧');
var lastRow = sht.getLastRow();
const values = sht.getRange(3, 1, lastRow - 2).getValues().flat();
var r = values.indexOf(no) + 3;
sht.getRange(r, 5).setValue(datetime);
sht.getRange(r, 6).setValue(userid);
return ContentService.createTextOutput(today + "\n" + sht.getRange(r, 2).getValue() + "\n" + userid);
}

0

2Answer

スプレッドシートのシートの名前が発送一覧になっていますか?(シートの名前は画面下部にあるやつです)
シートの名前が異なると同じエラーが表示されます。

動画のまま、コードを変更せずに実行した場合エラーにならなかったので、変更した箇所がエラーの原因になっていると思います。
動画のものから変更した箇所をすべて教えてもらえるともう少し詳細な原因がわかるかもしれないです。

0Like

Comments

  1. @karikura

    Questioner

    ご回答ありがとうございます!!
    シート名も「発送一覧」と変更しています。

    動画からとったコードは「クラス名」など必要ないものがあったので
    ほしいコードだけ抜き取って記載したという経緯があります。

    この書き方はちがうでしょうか?><

    キャプチャ.JPG

    image.png

    image.png

  2. @karikura

    Questioner

    ちなみに、URLとQRコードは作成されスプレッドに記載はされるのですが
    URLへアクセスするとこのエラー
    「TypeError: Cannot read properties of null (reading 'getLastRow')(行 7、ファイル「QRリクエスト」)」
    となります。

  3. SpreadsheetAppのドキュメントを見てみましたが、getActiveSpreadsheetAppが見つかりませんでした。
    恐らくgetActiveの間違いでそれが原因の可能性があります。

    SpreadsheetApp.getActive().getSheetByName('発送一覧');
    
  4. @karikura

    Questioner

    ありがとうございます!
    変えてみましたが変化なしです…><

    ちなみに
    スプレッドの共有設定も全員(編集者)とし、デプロイの範囲設定も全員としてます。

    image.png

  5. スクリプトの変更後、再デプロイは行いましたか?
    バージョンを上げるか再デプロイをしないと変更は反映されないはずです。

    シート名に半角スペースなどが入っていないかもう一度確認してみてください。

    getActive()がnullの場合はgetSheetByNameが実行できないため、エラーはその行で表示されるはずです。
    ただgetLastRowの行でエラーが出ているということなのでgetActiveでスプレッドシートの取得はできていて、getSheetByNameでシートが取れていないということになります。

    それでもダメなようでしたら、以下のようにdoGetメソッドを変更して実行してみてください。

    function doGet(e) {
     const sheets = SpreadsheetApp.getActive().getSheets();
     for (var i = 0; i < sheets.length; ++i){
      console.log(sheets[i].getName());
     }
     var no = e.parameter.no;
     var datetime = new Date();
     var today = Utilities.formatDate(datetime,'JST', 'yyyy/MM/dd');
     var userid = Session.getActiveUser().getEmail();
     var sht = SpreadsheetApp.getActive().getSheetByName('発送一覧');
     var lastRow = sht.getLastRow();
     const values = sht.getRange(3, 1, lastRow - 2).getValues().flat();
     var r = values.indexOf(no) + 3;
     sht.getRange(r, 5).setValue(datetime);
     sht.getRange(r, 6).setValue(userid);
     return ContentService.createTextOutput(today + "\n" + sht.getRange(r, 2).getValue() + "\n" + userid);
    }
    

    上記の実行ログで発送一覧というのが一覧の中にありますか?

  6. @karikura

    Questioner

    いただいたコードに書き換え、デプロイも再度対応したらURL飛べるようになりました!!
    (ただスクリプト実行するとログには変わらずエラー表示はあります。「発送一覧」表示もログにあります)

    ●URLへ飛ぶと、画像のようにB2の項目名(備品名)の固定表示となっています。
    (スプレッド4行5行に書いたとしても。)

    ●URL接続後、スプレッドへE2へ日付、F2へメアド 記入となってしまいます。
    (スプレッド4行5行に書いたとしても。)

    これはどこを編集したらよいでしょうか??

    <ログ>
    image.png

    <URLリンク画面>

    image.png

  7. 実行ログのエラーに関しては気にしなくても大丈夫です。
    追加した上部の4行についても削除してもらって大丈夫です。
    ↓少しコードを整理しました。

    function doGet(e) {
     var no = e.parameter.no;
     var datetime = new Date();
     var today = Utilities.formatDate(datetime,'JST', 'yyyy/MM/dd');
     var userid = Session.getActiveUser().getEmail();
     var sht = SpreadsheetApp.getActive().getSheetByName('発送一覧');
    
     // 最後の行のインデックスを取得
     var lastRow = sht.getLastRow();
     // 備品コード取得
     const headerRowCount = 2;
     const firstItemIndex = headerRowCount + 1;
     const codes = sht.getRange(firstItemIndex, 1, lastRow - headerRowCount).getValues().flat();
     // チェックするアイテムの行のインデックスを取得
     var itemRowIndex = codes.indexOf(no) + firstItemIndex;
     
     // チェックした日付とユーザーのメールアドレスをセット
     const checkedDateColumnIndex = 5;
     const checkedUserIdColumnIndex = 6;
     sht.getRange(itemRowIndex, checkedDateColumnIndex).setValue(datetime);
     sht.getRange(itemRowIndex, checkedUserIdColumnIndex).setValue(userid);
    
     // チェックした備品名取得
     const itemName = sht.getRange(itemRowIndex, 2).getValue();
     return ContentService.createTextOutput(today + "\n" + itemName + "\n" + userid);
    }
    

    URLの問題ですが、bihinlabelメソッドのqrc1のURLのバックスラッシュが抜けているようです。

    // 修正前
    var qrc1 = '="https://script.google.com/a/macros/s/\"&$B$1&\"/exec?no=\"&A' + i;
    
    // 修正後
    var qrc1 = '=\"https://script.google.com/a/macros/s/\"&$B$1&\"/exec?no=\"&A' + i;
    

    修正後QRコードを再作成してください。

  8. @karikura

    Questioner

    ありがとうございます!!!!!!!
    大変ありがたいです!!!

    いただいたもので修正と再デプロイ、QR再発行をしました。
    (スラッシュがぬけていたものも)

    ①スプレッドシートがやはり画像のように、QRにアクセスするとC3列のQRをクリックしたとしてもE2とF2に記入されてしまいます…

    ②C3列のQRアクセスしたとしても、変わらずリンク先は「日付」「備品名」「メアド」となり3行目の「机」と表示されません><

    image.png

    image.png

  9. コードが数値として解釈されてしまっている可能性があります。
    以下のように修正してみてください。

    // 修正前
    var no = e.parameter.no;
    // 修正後
    var no = String(e.parameter.no);
    
    // 修正前
    const codes = sht.getRange(firstItemIndex, 1, lastRow - headerRowCount).getValues().flat();
    // 修正後
    const codes = sht.getRange(firstItemIndex, 1, lastRow - headerRowCount).getValues().flat().map(String);
    
  10. @karikura

    Questioner

    修正したら
    完璧に理想通りのものができました~~~~!!!!
    ありがとうございます!!!!!

    とっても勉強になりました!
    とても助かりました。

    本当にありがとうございます。

Cannot read properties of null (reading 'getLastRow')

このエラーは sht.getLastRow();shtnull であることを意味しています。その理由はおそらく @abiii さんの推察のとおりでしょう。

Cannot read properties of undefined (reading 'parameter')

このエラーは var no = e.parameter.no;eundefined であることを意味しています。関数 doGet の仮引数eはイベントオブジェクトと言って、トリガーによって関数が実行されるときに渡されるデータです。おそらくこの関数をスクリプトエディタで直接実行するなどして、有効な引数eが渡されていないのでeundefinedなのではないでしょうか?

doGetが適切にトリガーによって実行されるよう、手順を確認してください。

0Like

Comments

  1. @karikura

    Questioner

    ご回答ありがとうございます!!
    @abiii さんのとおり、シート名は編集済みなのですが、作成されたURL(QR)へアクセスすると「Cannot read properties of null (reading 'getLastRow')」エラーとなります。。

    トリガー実行については、手順通りのつもりなのですが、いまだに原因がわかりません><
    「Cannot read properties of undefined (reading 'parameter')」

Your answer might help someone💌