GASで作ったシステムが全然動きません。

実現したいこと

エラーが現れないようにコードを修正したいです。

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

請求書の自動作成をしようと、GASでコードを書いて実行していますが、ずっとエラーが出てしまいます。

エラーメッセージ

error

1TypeError: Cannot read properties of undefined (reading 'length')

該当のソースコード

//プログラムA-0|プログラム名 function Seikyusho() { //プログラムA-1|スプレッドシートを設定 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();//変数spreadsheetに「アクティブなスプレッドシート」を設定 var sheet = spreadsheet.getSheetByName('予定表');//変数sheetに「シート1」シートを設定 var myRange = sheet.getDataRange().getValues();//スプレッドシートのデータを二次元配列として取得 //プログラムA-2|変数templateに「請求書フォーマット」シートを設定 var template = spreadsheet.getSheetByName('請求書フォーマット');//変数sheetに「請求書フォーマット」シートを設定 var start= template.getRange('O4').getValue();//「請求書フォーマット」のセルJ4の日付を取得 var startdate = Moment.moment(start).subtract(1, 'd');//変数startの日付をMomentで設定(1日前を設定) var end= template.getRange('O5').getValue();//「請求書フォーマット」のセルJ5の日付を取得 var enddate = Moment.moment(end).add(1, 'd');//変数endの日付をMomentで設定(1日後を設定) //プログラムA-3|空の配列を設定 var torihiki = []; //プログラムA-4|プログラム2の取引先(E列)をプログラム3の空配列に取得 for (var i=1; i<myRange.length; i++){ torihiki.push(myRange[i][3]);//配列torihikiにmyRange[i][4]を追加 } //プログラムA-5|プログラム4の取引先名の重複を削除 var torihiki_list = torihiki.filter(function(value, i, self){ return self.indexOf(value) === i; }); //プログラムA-6|取引先ごとに繰り返す for (var i=0; i<4; i++){ //プログラムA-6-1|空の配列を設定 var myHizuke = []; var myGenba = []; var myTanka = []; var myNinzu = []; var myZangyo = []; var myTimeShigyo = []; var myTimeSyugyo = []; var myZangyoHaya = []; var myZangyoDai = []; var myZangyoShinya = []; var myKoutuhi = []; var myGoukei = []; //プログラムA-6-2|取引先ごとに、プログラム6-1で設定した配列に格納 for (var k=1; k<myRange.length; k++){ if (Moment.moment(myRange[k][0]).isAfter(startdate) && Moment.moment(myRange[k][0]).isBefore(enddate)){ if (myRange[k][6] == torihiki_list[i]){ //myRange[k][4](取引先)とtorihiki_list[i]が一致すれば myHizuke.push([myRange[k][0]]); myGenba.push([myRange[k][1]]); myTanka.push([myRange[k][11]]); myTimeShigyo.push([myRange[k][4]]); myTimeSyugyo.push([myRange[k][5]]); myZangyoHaya.push([myRange[k][6]]); myZangyoDai.push([myRange[k][7]]); myZangyoShinya.push([myRange[k][8]]); myKoutuhi.push([myRange[k][10]]); myGoukei.push([myRange[k][14]]); } } } // データを蓄積する var pool_Hizuke = []; var pool_Genba = []; var pool_Tanka = []; var pool_Ninzu = []; var pool_TimeShigyo = []; var pool_TimeSyugyo = []; var pool_ZangyoHaya = []; var pool_ZangyoDai = []; var pool_ZangyoShinya = []; var pool_Koutuhi = []; var pool_Goukei = []; // 各取引先ごとに重複をなくす var unique_Hizuke = myHizuke.filter(function(value, i, self){ return self.indexOf(value) === i; }); var unique_Genba = myGenba.filter(function(value, i, self){ return self.indexOf(value) === i; }); var unique_Tanka = myTanka.filter(function(value, i, self){ return self.indexOf(value) === i; }); var unique_TimeShigyo = myTimeShigyo.filter(function(value, i, self){ return self.indexOf(value) === i; }); var unique_TimeSyugyo = myTimeSyugyo.filter(function(value, i, self){ return self.indexOf(value) === i; }); var unique_ZangyoHaya = myZangyoHaya.filter(function(value, i, self){ return self.indexOf(value) === i; }); var unique_ZangyoDai = myZangyoDai.filter(function(value, i, self){ return self.indexOf(value) === i; }); var unique_ZangyoShinya = myZangyoShinya.filter(function(value, i, self){ return self.indexOf(value) === i; }); var unique_Koutuhi = myKoutuhi.filter(function(value, i, self){ return self.indexOf(value) === i; }); //プログラム|日付ごとに繰り返す for (var a=0; a<unique_Hizuke.length; a++){ for (var b=0; b<unique_Genba.length; b++ ){ for (var c=0; c<unique_Tanka.length; c++ ){ for (var d=0; d<unique_TimeShigyo.length; d++){ for (var e=0; e<unique_TimeSyugyo.length; e++){ for(var f=0; f<unique_ZangyoHaya.length; f++){ for(var g=0; g<unique_ZangyoDai.length; g++){ for(var h=0; h<unique_ZangyoShinya.length; h++){ for(var z=0; z<unique_Koutuhi.length; z++){ for (var x=0; x<myHizuke.length; x++){ var count = 0; var sum_ZangyoHaya = 0; var sum_ZangyoDai = 0; var sum_ZangyoShinya = 0; var sum_Koutuhi = 0; var sum_Goukei = 0; if (myHizuke[x][0]==unique_Hizuke[a] && myGenba[x][0]==unique_Genba[b]&& myTanka[x][0]==unique_Tanka[c] && myTimeShigyo[x][0]==unique_TimeShigyo[d] && myTimeSyugyo[x][0]==unique_TimeSyugyo[e] && myZangyoHaya[x][0]==unique_ZangyoHaya[f] && myZangyoDai[x][0]==unique_ZangyoDai[g] && myZangyoShinya[x][0]==unique_ZangyoShinya[h] && myKoutuhi[x][0]==unique_Koutuhi[z]){ count++; sum_ZangyoHaya += myZangyoHaya[x][0]; sum_ZangyoDai += myZangyoDai[x][0]; sum_ZangyoShinya += myZangyoShinya[x][0]; sum_Koutuhi += myKoutuhi[x][0]; sum_Goukei += myGoukei[x][0]; } } pool_Hizuke.push([unique_Hizuke[a]]); pool_Genba.push([unique_Genba[b]]); pool_Ninzu.push([count]); pool_TimeShigyo.push([unique_TimeShigyo[d]]); pool_TimeSyugyo.push([unique_TimeSyugyo[e]]); pool_Tanka.push([unique_Tanka[c]]); pool_ZangyoHaya.push([sum_ZangyoHaya]); pool_ZangyoDai.push([sum_ZangyoDai]); pool_ZangyoShinya.push([sum_ZangyoShinya]); pool_Koutuhi.push([sum_Koutuhi]); pool_Goukei.push([sum_Goukei]); } } } } } } } } } //プログラムA-6-3|シートを追加して、シート名を各取引先に変更 var newsheet = template.copyTo(spreadsheet);//「請求書フォーマット」のシートをコピーする newsheet.setName(torihiki_list[i]);//コピーしたシートの名前を「torihiki[i]」にする //プログラムA-6-4|ID,摘要,納品日,取引金額を新しいシートの14行目以下に貼り付け newsheet.getRange(14,2,pool_Hizuke[0].length, 1).setValues(pool_Hizuke); newsheet.getRange(14,3,pool_Genba[0].length, 1).setValues(pool_Genba); newsheet.getRange(14,5,pool_Ninzu[0].length, 1).setValues(pool_Ninzu); newsheet.getRange(14,6,pool_TimeShigyo[0].length, 1).setValues(pool_TimeShigyo); newsheet.getRange(14,7,pool_TimeSyugyo[0].length, 1).setValues(pool_TimeSyugyo); newsheet.getRange(14,8,pool_Hizuke[0].length, 1).setValues(pool_Hizuke); newsheet.getRange(14,9,pool_Tanka[0].length, 1).setValues(pool_Tanka); newsheet.getRange(14,10,pool_ZangyoHaya[0].length, 1).setValues(pool_ZangyoHaya); newsheet.getRange(14,7,pool_ZangyoDai[0].length, 1).setValues(pool_ZangyoDai); newsheet.getRange(14,8,pool_ZangyoShinya[0].length, 1).setValues(pool_ZangyoShinya); newsheet.getRange(14,9,pool_Koutuhi[0].length, 1).setValues(pool_Koutuhi); newsheet.getRange(14,10,pool_Goukei[0].length, 1).setValues(pool_Goukei); //プログラムA-6-5|変数goukeiを0リセット var goukei = 0; //プログラムA-6-6|14行目以降のC~Eを結合して、取引金額の合計値を算出 for (var j=0; j<myHizuke.length; j++){ var row = j+14;//行のカウントアップ newsheet.getRange('C'+ row + ':D' + row).merge();//セルC~セルEの結合 goukei = goukei + Number(pool_Goukei[j]);//取引先ごとの取引金額を算出 } //プログラムA-6-7|シートに請求書情報を入力 var today = Moment.moment(new Date()); var hiduke = Moment.moment(start); var duedate = today.clone().add(15, 'd').format('YYYY/MM/DD');//請求日の期限を設定 var month = hiduke.clone().format('YYYY年MM月');//年月の取得 var formatteddate = today.clone().format('YYYY/MM/DD'); newsheet.getRange('B4').setValue(torihiki_list[i]);//請求書のセルB4に取引先を入力 newsheet.getRange('B6').setValue('下記項目のとおり請求致します');//請求書のセルB6に入力 newsheet.getRange('G3').setValue(formatteddate + '_' + Number(i+1));//請求書のセルG3に請求書IDを入力 newsheet.getRange('G4').setValue(new Date());//請求書のセルG4に請求日(今日の日付)を入力 newsheet.getRange('C9').setValue(goukei + '円');//請求書のセルC9に合計金額を入力 newsheet.getRange('C11').setValue(duedate);//請求書のセルC11に請求日の期限を入力 newsheet.getRange('B14:L' + row).setBorder(true, true, true, true, true, true, null, SpreadsheetApp.BorderStyle.SOLID);//14行目~最終行まで罫線を引く Utilities.sleep(1000); //1秒待機(待機中に情報を更新) SpreadsheetApp.flush(); //挿入したシートの情報更新 }//終わり }//終わり

試したこと・調べたこと

上記の詳細・結果

チャットGPTに添削をお願いしながら書き進めていますが、どうしてもなんで値が上手く格納されないのか分かりません。

補足

特になし

コメントを投稿

0 コメント