該当セルの行を抽出してカット&ペーストで
'対応済み'シートに転記させたいです。
って書いてらっしゃるのですから、"カット&ペースト" したことあると思うんですが、元の表の書式が消えます。
本当にそれでよいのでしょうか。
- カット&ペースト方式でいくなら、元の表が歯抜けになる。書式も崩れる。
元の表でカットした場所を行単位で消せば体裁は整う。
が、実行するたび表が縮んでいく。
→ q376142 の方法
2. データだけを取り出して移動することはできる。
条件付き書式を適切に利用できているなら、書式が壊れない。
ただし、数式がある場合、数式は移動できず値になってしまう。
→ q376142_notmove の方法
上記から、データ管理用のシートを別にして、色を付けたりセルを結合したりする見栄えを整えるシートは別にしたほうがいいです。これは Excel でも Google Spreadsheet でもデータを管理する上での基本とご理解いただいたほうがいいです。
結合セルのあるシートで getLastRow などをすると最後の行や最後の列は結合セルの端を取ってしまって意図した動作をしません(下記のように対応できますが、Google さんが用意している便利関数である getLastRow が使えず、面倒な操作が必要です)。
javascript
1const q376142 = () => {
2 const srcSheetName = "DL管理票";
3 const dstsheetName = "対応済み";
4 const srcSheet = SpreadsheetApp.getActive().getSheetByName(srcSheetName);
5 const dstSheet = SpreadsheetApp.getActive().getSheetByName(dstsheetName);
6 const statusToFind = srcSheet.getRange(1,1).getValue();
7 const rowsToMove = srcSheet.createTextFinder(statusToFind).findAll().filter(e=> e !== null).map(e=>[e.getRow(),e.getColumn()]).filter(([,c])=> c === 2).map(([r])=>r);
8 if(rowsToMove.length < 1) return;
9 let column = srcSheet.getLastColumn();
10 let destinationRow = dstSheet.getDataRange().getValues().map(([,e])=>e).reduce((a,c,i)=> c !== "" ? i : a,0) + 2;
11 rowsToMove.forEach(e=> {
12 srcSheet.getRange(e,2,1,column).moveTo(dstSheet.getRange(destinationRow,2,1,column));
13 destinationRow++;
14 });
15 // 以下を消すと、行が消えなくなる。
16 rowsToMove.reverse().forEach(e=> {
17 srcSheet.deleteRow(e);
18 })
19 // 消すのはここまで。
20}
21const q376142_notmove = () => {
22 const srcSheetName = "DL管理票";
23 const dstsheetName = "対応済み";
24 const srcSheet = SpreadsheetApp.getActive().getSheetByName(srcSheetName);
25 const dstSheet = SpreadsheetApp.getActive().getSheetByName(dstsheetName);
26 const src = srcSheet.getDataRange().getValues();
27 const statusToFind = src[0][0];
28 if(statusToFind === "") return;
29 const dataToMove = src.slice(2).filter(([,e])=> e === statusToFind).map(e=>e.slice(1));
30 const moveRows = dataToMove.length;
31 if(moveRows < 1) return;
32 const moveColumns = dataToMove[0].length;
33 const destinationRow = dstSheet.getDataRange().getValues().map(([,e])=>e).reduce((a,c,i)=> c !== "" ? i : a,0) + 2;
34 dstSheet.getRange(destinationRow,2,moveRows,moveColumns).setValues(dataToMove);
35 const empties = Array.from({length:moveRows},_=>Array.from({length:moveColumns},_=>""));
36 const remains = src.slice(2).filter(([,e])=> e !== statusToFind).map(e=>e.slice(1)).concat(empties);
37 srcSheet.getRange(3,2,remains.length,remains[0].length).setValues(remains);
38}