Q&A
前提
次の3つのスプレッドシートファイルがあります。
1)全体票
2)個票ひな形
3)個票ひな形のコピー
1)のイメージ
2)のイメージ 一部抜粋
実現したいこと
a:ファイル1)のB列にチェックを入れ、GAS実行すると、
指定フォルダ内にファイル2)をコピーしたファイル3)を作成する。
ファイル1)のD列、E列にファイル3)のファイルID、URLを転記する。
(複数行にチェックありの時には、複数ファイルを生成)
b:ファイル3)のファイル名を指定ファイル名に変更し、
ファイル3)のいくつかの項目内容をファイル1)から転記する。
(複数行にチェックありの時には、各ファイルに対し、同処理)
c:処理が完了したら、ファイル1)のC列にタイムスタンプを追記する。
最後に処理終了のポップアップメッセージを表示する。
d:処理の際、b列のどこにもチェックがなかった場合には、
処理中断する旨のポップアップメッセージを表示し、処理終了。
発生している問題・エラーメッセージ
dの処理がうまくできず困っています。
どのようにコード修正すればよいかアドバイスが欲しいです。
以下の方法でファイル1)の「b列のどこにもチェックがなかった」判別
をさせようと試みました。
(試みた方法)
二次元配列fromDetaの各行から一番はじめの要素0? 1? flagのみを
spliceで抽出し、新たな配列flagArrを作成。
if条件で flagArr === false の時に、処理中止のメッセージを表示させ、
ループから抜ける想定。
<困っていること①>
console.log()で確認すると、flagArrの配列は取得自体はできている
ようなのですが、false3つ以外に想定していなかった後ろに' 'の要素が
いくつもついてきてしまい、spliceで抜きだしたいと思っていた通りに
抜けてきていないようです。
ちなみにconsole.log()でtargetRows想定通りの3となっています。
二次元配列の特定列の削除(抽出)の方法は、以前教えていただいた下リンク先
を参照しました。
<困っていること②>
dの処理が失敗しているから、なのかもしれないですが、
「b列のどこにもチェックがなかった」場合でも、正常に処理終了したときの
メッセージが表示されてしまいます。
「b列のどこにもチェックがなかった」場合は、「処理終了」メッセージのみ
表示させ正常処理のメッセージは表示させないようにしたいのですが、
どのようにコード修正すればよいかアドバイスが欲しいです。
該当のソースコード
以下、コード全文記載します。
もし、ココをこう修正するともっとすっきりとわかりやすいコードになる、
というアドバイスがあれば併せてご教示いただけると助かります。
GAS
1function createIndvSS() { 2 3 /* (処理概要) 個票を作成 4 ・全体票_案件シートの個票作成(B列)にチェックありの場合に処理 ★未完★ 5 ・ひな形ファイルtempSSをコピーし、全体票ファイル_【作業要シート】セルC12のフォルダに格納 6 ・新設個票ファイルのファイル名を「個票_案件(氏名)」に変更する 7 ・新設個票ファイルに全体票の内容を転記する 8 ・全体票_案件シートのC列にタイムスタンプを追記する 9 ・処理完了のポップアップメッセージを表示する 10 */ 11 12 //個票ひな形ファイルのコピーを作成 13 14 //▼個票ひな形ファイルtempSSの指定 15 //URL https://docs.google.com/spreadsheets/d/~省略~/edit#gid=0 16 //~省略~ 17 //ひな形ファイル(FromSS)のIDは全体票SS_【作業用】シートのセルC6から取得 18 const AllSS = SpreadsheetApp.getActiveSpreadsheet(); 19 const AddrSheet = AllSS.getSheetByName('【作業用】'); 20 const tempId = AddrSheet.getRange(6, 3).getValue(); 21 console.log('tempId ' + tempId); 22 const tempSS = DriveApp.getFileById(tempId); 23 24 //▼新設個票ファイルの保存先フォルダToFの指定 25 //URL https://drive.google.com/drive/~省略~ 26 //1cdHckGcAAbUlF7elu6Z-BFCLDh38W6C4 27 //保存先フォルダToFのフォルダIDは全体票SS_【作業用】シートのセルC12から取得 28 const toFolId = AddrSheet.getRange(12, 3).getValue(); 29 console.log('toFolId ' + toFolId); 30 const toFol = DriveApp.getFolderById(toFolId); 31 32 //全体票_案件シートのH列データあり最終行lastRowの取得 33 const AllSheet = AllSS.getSheetByName('案件シート'); 34 const lastRow = AllSheet.getRange(AllSheet.getMaxRows(), 8).getNextDataCell(SpreadsheetApp.Direction.UP).getRow(); 35 console.log('lastRow ' + lastRow); //8が正解 36 const targetRows = lastRow - 6 37 console.log('targetRows ' + targetRows); //2が正解 38 39 //▼全体票_案件シートのB列~Y列の内容を二次元配列fromDetaとして取得 40 const fromDeta = AllSheet.getRange(7, 2, targetRows, 24).getValues(); 41 console.log('fromDeta ' + fromDeta); 42 43 for (let i = 0; i < targetRows; i++) { 44 let flag = fromDeta[i][0]; //作成フラグ 45 let case = fromDeta[i][6]; //案件 46 let No1 = fromDeta[i][7]; //項目1 47 let No2 = fromDeta[i][8]; //項目2 48 let No3 = fromDeta[i][9]; //項目3 49 let No5 = fromDeta[i][10]; //項目5 50 let No6 = fromDeta[i][11]; //項目6 51 let No7 = fromDeta[i][13]; //項目7 52 let No9 = fromDeta[i][15]; //項目9 53 let No10 = fromDeta[i][17]; //項目10 54 let No11 = fromDeta[i][19]; //項目11 55 let No12 = fromDeta[i][20]; //項目12 56 let No14 = fromDeta[i][22]; //項目14 57 let No15 = fromDeta[i][23]; //項目15 58 59 //個票作成フラグにチェックありの時だけ処理 60 //ブランクの時は処理スキップ 61 // if(条件){ 62 // 条件trueの時に行う処理 63 // } 64 65 /*【条件①】//★うまくできない_ここから★ ***************************** 66 //個票作成フラグがALLブランクの時は、ポップアップMsgを表示して 67 //処理中止 68 69 //二次元配列fromDetaの各行から要素1のflagのみをspliceで抽出し、 70 //新しい配列flagArrを作成する 71 for (let i = 0; i < targetRows; i++) { 72 const flagArr = fromDeta[i].splice(0, 1); 73 console.log('targetRows ' + targetRows); 74 console.log('fromDeta[0] ' + fromDeta[0][0]); 75 console.log('fromDeta[1] ' + fromDeta[1][0]); 76 console.log('fromDeta[2] ' + fromDeta[2][0]); 77 console.log('flagArr ' + flagArr); 78 79 if (flagArr === false) { 80 Browser.msgBox("個票作成フラグが選択されていません。\\nどの案件の個票を作成するか、指定してください。\\n処理を中止します。"); 81 return; 82 } 83 } 84 ★ここまでうまくできない_ここまで★ **********************************/ 85 //【条件②】 86 //個票作成フラグにチェックありtrueの時 87 if (flag === true) { 88 89 //▼新設個票ファイルのファイル名SSName指定 90 //全体票SS_案件シートの案件(セルF7)_氏名(セルJ) 91 //★セル位置可変に変更要★ 92 const SSName1 = AllSheet.getRange(i + 7, 6).getValue(); 93 const SSName2 = AllSheet.getRange(i + 7, 10).getValue(); 94 const NewFileName = "個票_" + SSName1 + "(" + SSName2 + ")"; //新個票のファイル名 95 console.log('NewFileName ' + NewFileName); 96 97 //▼個票ひな形ファイルのコピーを作成 98 const newFile = tempSS.makeCopy(NewFileName, toFol); 99 100 //▼新設個票のファイルID、URLの取得 101 const newSSiD = newFile.getId(); 102 const newURL = newFile.getUrl(); 103 console.log('newSSiD ' + newSSiD); 104 console.log('newURL ' + newURL); 105 106 //▼新設個票のファイルID、URLを全体票_案件シートのD列とE列に転記 107 //★行位置可変に変更要★ 108 AllSheet.getRange(i + 7, 4).setValue(newSSiD); 109 AllSheet.getRange(i + 7, 5).setValue(newURL); 110 SpreadsheetApp.flush(); 111 112 //▼配列fromDetaとして取得した内容を新設個票IndvSS_経過シートに転記 113 const IndvSS = SpreadsheetApp.openById(newSSiD); 114 const IndvSheet = IndvSS.getSheetByName('経過シート'); 115 IndvSheet.getRange(2, 5, 1, 1).setValue(case); //案件(セルE2)の転記 116 IndvSheet.getRange(4, 5, 1, 1).setValue(No2); //項目2(セルE4)の転記 117 IndvSheet.getRange(5, 5, 1, 1).setValue(No5); //項目5(セルE5)の転記 118 IndvSheet.getRange(6, 5, 1, 1).setValue(No3); //項目3(セルE6)の転記 119 IndvSheet.getRange(7, 5, 1, 1).setValue(No4); //項目4(セルE7)の転記 120 IndvSheet.getRange(10, 5, 1, 1).setValue(No6); //項目6(セルE10)の転記 121 IndvSheet.getRange(10, 6, 1, 1).setValue(No7); //項目7(セルF10)の転記 122 IndvSheet.getRange(11, 5, 1, 1).setValue(No9); //項目9(セルE11)の転記 123 IndvSheet.getRange(11, 6, 1, 1).setValue(No10); //項目10(セルF11)の転記 124 IndvSheet.getRange(12, 5, 1, 1).setValue(No11); //項目11(セルE12)の転記 125 IndvSheet.getRange(12, 6, 1, 1).setValue(No13); //項目13(セルF12)の転記 126 IndvSheet.getRange(13, 5, 1, 1).setValue(No14); //項目14(セルE13)の転記 127 IndvSheet.getRange(13, 6, 1, 1).setValue(No15); //項目15 (セルF13)の転記 128 129 //▼全体票_案件シートのC列にタイムスタンプ追記 130 const timeStamp = new Date(); 131 console.log("timeStamp " + timeStamp); 132 133 //getRange(●行目,列目,行分,列分) 134 //7 + ループ処理回数i 行目 135 AllSheet.getRange(i + 7, 3, 1, 1).setValue(timeStamp); 136 } 137 } 138 //▼処理完了Msgの表示 139 //処理が詰まらないように強制実行 140 SpreadsheetApp.flush(); 141 Browser.msgBox("全体票ファイル_【作業用】シート_セルC12で指定したフォルダ内に個票ファイルを作成しました。\\n個票ファイル上に情報を転記済です。\\n適宜、個票ファイルをご確認ください。"); 142} 143
補足情報
次回から類似のケースなら自分で解決できるようになりたいので
(残念ながら、なかなかそのレベルに到達できずにいますが、、、)
回答は急ぎませんので非エンジニアビギナーでも理解できるレベル
での解説、アドバイスをいただけると助かります。
お忙しいところお手を煩わせて申し訳ありません。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2022/11/26 13:35
2022/11/26 16:45
2022/11/26 16:52 編集
2022/11/27 08:24
2022/11/27 11:22
2022/11/27 11:33 編集
2022/11/27 13:10