前提
スプレッドシートファイルの中に以下の2つのシートがあります。
GASで次の処理をさせたいです。
□処理1:②のシートをコピーし、③当月分シートを作成
□処理2:①の内容を③のシートにコピー
処理が完了したら、処理証跡として③のシートにタイムスタンプを追記
実現したいこと
スプレッドシートファイルの中に当月シートが存在しているか否かで
処理を条件分岐させたいです。
●存在していない
→処理1+2を実行
●存在している
ポップアップMsgを表示
転記処理を「継続」する(OK)か「中止」する(CANCEL)かを
ユーザーに選択させる。
OKクリックの場合
処理2を実行
キャンセルクリックの場合
「処理終了」のポップアップを表示させ、何も行わず、
そのまま処理終了
発生している問題・エラーメッセージ
現コードだと「存在している」場合の処理は走る。
しかし、「存在していない」場合がうまくいかない。
「OK」クリックすると処理1は走るが、処理2が行われず終了。
(参考) 存在していない」場合の処理結果
処理1に続けて、処理2も行わせたいのですが、
どこを、どのように修正すればよいのかがわかりません。
<質問1 >
修正方法のアドバイスが欲しいです。
<質問2>
キャンセルボタンクリック時で処理終了の際、return
と書きましたが returnの使い方あっていますか?
return、continue、breakの使い分け方がよくわかりません。
(if、forでは、breakは使わない??)
どのように使い分けをすればよいかもレクチャーしてほしいです。
該当のソースコード
以下、全文記載します。
GAS
1function inport_Test() { 2 const ss = SpreadsheetApp.getActiveSpreadsheet(); 3 const fromSheet = ss.getSheetByName("転記元"); 4 const tempSheet = ss.getSheetByName("[ひな形]転記先"); 5 const mySheetName = "2022年9月分"; 6 const tosheet = ss.getSheetByName(mySheetName); 7 8 //▼条件分岐:当月分シートが作成されているか 9 //(trueの場合)ファイル内に当月分シートがない場合 10 //★うまくいかない★ 処理1しか行われない。処理2もさせたい。 11 if (tosheet === null) { 12 13 //▼処理1:当日分の転記先シートを作成 14 //転記先シートをコピーし、新シートを一番左に作成 15 //新シートのシート名を変更 16 const newSheet = tempSheet.copyTo(ss).activate(); 17 ss.moveActiveSheet(0); 18 newSheet.setName(mySheetName); 19 } 20 //▼ファイル内に当月分シートがある場合(falseの場合) 21 //処理をつつげる(OK) or 処理中止(cancel)のポップアップ表示 22 else { 23 const res = Browser.msgBox("当月分シートは作成済です。\\n 転記処理を続けますか?", Browser.Buttons.OK_CANCEL); 24 25 //▼「OK」ボタンをクリックの場合 26 //処理2から実施 27 if (res === "ok") { 28 //「元シート(fromSheet)」のデータあり最終行取得 29 //C列にデータあり行で判定 30 const fromLastRow = fromSheet.getRange(fromSheet.getMaxRows(), 3).getNextDataCell(SpreadsheetApp.Direction.UP).getRow(); //6が正解 31 const fromtargetRows = fromLastRow - 3 32 console.log("fromLastRow " + fromLastRow); // 6が正解 33 console.log("fromtargetRows " + fromtargetRows); // 3が正解 34 35 //▼処理2:データ転記処理 36 //<処理2-1>転記元データの取得 37 //「元シート(fromSheet)」の「項目3(B列)」~「項目2(I列)」の内容を 38 //二次元配列(mydetaRange)として取得 39 //getRange(●行、▲列、■行分、◆列分) 40 const mydetaRange = fromSheet.getRange(4, 2, fromtargetRows, 8).getValues(); 41 console.log("mydetaRange" + mydetaRange); 42 43 for (let r = 0; r <= fromtargetRows - 1; r++) { 44 //配列(mydetaRange)で取得した内容のうち転記したい項目 45 //[行インデックス][列インデックス] 46 let deta3 = mydetaRange[r][0]; 47 let deta4 = mydetaRange[r][1]; 48 let deta5 = mydetaRange[r][2]; 49 let deta6 = mydetaRange[r][3]; 50 let deta7 = mydetaRange[r][4]; 51 let deta8 = mydetaRange[r][5]; 52 let deta1 = mydetaRange[r][6]; 53 let deta2 = mydetaRange[r][7]; 54 console.log(deta3); 55 56 //<処理2-2>「転記先シート(toSheet)」に配列データを転記 57 //getRange(●行、▲列、■行分、◆列分) 58 //B列に項目1(deta1)を転記 59 const mySheet = ss.getSheetByName("転記先"); 60 const copydeta1 = tosheet.getRange(4 + r, 2, 1, 1).setValue(deta1); 61 const copydeta2 = tosheet.getRange(4 + r, 3, 1, 1).setValue(deta2); 62 const copydeta3 = tosheet.getRange(4 + r, 4, 1, 1).setValue(deta3); 63 const copydeta4 = tosheet.getRange(4 + r, 5, 1, 1).setValue(deta4); 64 const copydeta5 = tosheet.getRange(4 + r, 6, 1, 1).setValue(deta5); 65 const copydeta6 = tosheet.getRange(4 + r, 7, 1, 1).setValue(deta6); 66 const copydeta7 = tosheet.getRange(4 + r, 8, 1, 1).setValue(deta7); 67 const copydeta8 = tosheet.getRange(4 + r, 9, 1, 1).setValue(deta8); 68 69 //<処理2-3>タイムスタンプの追記 70 //getRange(●行、▲列、■行分、◆列分) 71 //J列にタイムスタンプを転記 72 const timeStamp = new Date(); 73 const setTimestamp = tosheet.getRange(4 + r, 10, 1, 1).setValue(timeStamp); 74 75 } 76 tosheet.activate(); 77 Browser.msgBox("データ転記処理が完了しました。"); 78 } 79 //「キャンセル」ボタンをクリックの場合 80 //転記処理終了 81 if (res === "cancel") { 82 Browser.msgBox("転記処理を中止します。"); 83 return; 84 } 85 } 86}
補足情報(FW/ツールのバージョンなど)
回答は本日中でなくてもよいです。
非エンジニアビギナーです。
次回から自力解決できるようになりたいので、非エンジニアビギナー
でも理解できるレベルでの解説をいただけると助かります。
お忙しいところ申し訳ありませんが、どうぞよろしくお願いいたします。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/09/13 13:55
退会済みユーザー
2022/09/13 14:59 編集
2022/09/14 08:33