質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

1回答

1918閲覧

MoveTo GASコード

ch-taros164

総合スコア2

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

1クリップ

投稿2021/12/30 15:28

編集2021/12/31 00:28

前提・実現したいこと

データ一覧表の'DL管理表'シートの中から'kensaku'テーブルに入力したキーワードを検索し、
該当セルの行を抽出してカット&ペーストで
'対応済み'シートに転記させたいです。

発生している問題・エラーメッセージ

実行を押しても何も変動がありません

該当のソースコード

function taiouuchuu() {
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet1 = spreadsheet.getSheetByName('DL管理票');
const sheet2 = spreadsheet.getSheetByName('対応済み');
const kensaku = 'DL管理票 Range("A1:B1")';
const LastRow = 'DL管理票.getLastRow()';
const LastRow2 = '対応済み.getLastRow()';

for (var i = 'kensaku';i < kensaku.length; i++){
if (kensaku[i][0] == 'kensaku'){
result.push ('kensaku'[i]);

'DL管理票'.getRange ('kensaku').moveTo ('対応済み.getRange(LastRow2+1)' );
}
}
}

試したこと

数日間、コードを色々と調べてGASを作ったのですが、
マクロ(GAS)実行を押しても何も変動がありません。

補足情報(FW/ツールのバージョンなど)

探す対象
貼り付け対象
このシートです

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2021/12/30 22:14

コードからやりたいことを理解できなかったのでシートがどうなっているか共有可能でしょうか? 特にわからないのは、ケンサクテーブルがどういうものでどう入力されているか、と、探す対象の範囲、貼り付ける先の状態、です。
ch-taros164

2021/12/31 00:11

追記いたしました。よろしくお願いいたします。
guest

回答1

0

該当セルの行を抽出してカット&ペーストで
'対応済み'シートに転記させたいです。

って書いてらっしゃるのですから、"カット&ペースト" したことあると思うんですが、元の表の書式が消えます。
本当にそれでよいのでしょうか。

  1. カット&ペースト方式でいくなら、元の表が歯抜けになる。書式も崩れる。

元の表でカットした場所を行単位で消せば体裁は整う。
が、実行するたび表が縮んでいく。
→ 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}

投稿2021/12/31 10:35

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ch-taros164

2021/12/31 10:46

管理票シートのB3セル以降の行の中から、A1:B1セルに入力して検索抽出した行毎のデータを、対応済みシートのB3セル以降の行に転記させるマクロを作りたいです。
papinianus

2021/12/31 15:21

こちらではそういう風に動いてます。確認ですが試したうえでおっしゃってますよね。 想定と違うところを具体的に伺いたいです。 > 作りたいです。 作るまでの期限にもよりますが、かなり遠いと思います。 この質問のコードを書いた人が別質問の VBA を書いたとは思えないです。 やりたいというならがんばってくださいとしか言えないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問