スプレッドシートのシートの名前が発送一覧になっていますか?(シートの名前は画面下部にあるやつです)
シートの名前が異なると同じエラーが表示されます。
動画のまま、コードを変更せずに実行した場合エラーにならなかったので、変更した箇所がエラーの原因になっていると思います。
動画のものから変更した箇所をすべて教えてもらえるともう少し詳細な原因がわかるかもしれないです。
初心者です。
ユーチューブを参考に、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);
}
スプレッドシートのシートの名前が発送一覧になっていますか?(シートの名前は画面下部にあるやつです)
シートの名前が異なると同じエラーが表示されます。
動画のまま、コードを変更せずに実行した場合エラーにならなかったので、変更した箇所がエラーの原因になっていると思います。
動画のものから変更した箇所をすべて教えてもらえるともう少し詳細な原因がわかるかもしれないです。
@karikura
Questioner@karikura
Questionerちなみに、URLとQRコードは作成されスプレッドに記載はされるのですが
URLへアクセスするとこのエラー
「TypeError: Cannot read properties of null (reading 'getLastRow')(行 7、ファイル「QRリクエスト」)」
となります。
SpreadsheetAppのドキュメントを見てみましたが、getActiveSpreadsheetAppが見つかりませんでした。
恐らくgetActiveの間違いでそれが原因の可能性があります。
SpreadsheetApp.getActive().getSheetByName('発送一覧');
@karikura
Questionerスクリプトの変更後、再デプロイは行いましたか?
バージョンを上げるか再デプロイをしないと変更は反映されないはずです。
シート名に半角スペースなどが入っていないかもう一度確認してみてください。
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);
}
上記の実行ログで発送一覧というのが一覧の中にありますか?
@karikura
Questioner実行ログのエラーに関しては気にしなくても大丈夫です。
追加した上部の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コードを再作成してください。
@karikura
Questionerコードが数値として解釈されてしまっている可能性があります。
以下のように修正してみてください。
// 修正前
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);
@karikura
Questioner修正したら
完璧に理想通りのものができました~~~~!!!!
ありがとうございます!!!!!
とっても勉強になりました!
とても助かりました。
本当にありがとうございます。
Cannot read properties of null (reading 'getLastRow')
このエラーは sht.getLastRow();
で sht
が null
であることを意味しています。その理由はおそらく @abiii さんの推察のとおりでしょう。
Cannot read properties of undefined (reading 'parameter')
このエラーは var no = e.parameter.no;
で e
が undefined
であることを意味しています。関数 doGet
の仮引数e
はイベントオブジェクトと言って、トリガーによって関数が実行されるときに渡されるデータです。おそらくこの関数をスクリプトエディタで直接実行するなどして、有効な引数e
が渡されていないのでe
がundefined
なのではないでしょうか?
doGet
が適切にトリガーによって実行されるよう、手順を確認してください。