GASまったくの初心者です。
いろんなサイトを確認していますが、応用できず質問させていただきます。
下記の条件で、転記元から転記先のシートの最終列にコピーできるようにしたいです。
①転記元のE列が「確定」になっていること
②転記元のG列(番号)と転記先のF列を比較し、同じ番号があれば無視
⑤同じ番号がない場合、転記先の最終列(A列以降)に転記元のデータB列~I列、M列をコピー
(下記の表の場合黄色い部分)
こちらの回答が似ているかと思いますが、自分のやりたいことにうまく当てはめることができません。
https://teratail.com/questions/m9951yjox94ueq
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2023/07/27 03:44

回答1件
0
ベストアンサー
例えば次のようなスクリプトでしょうか。(修正案の再修正をアップしました。)
当初の例で画像シートの行、列、配列のインデックスを数値のまま(いわゆるマジックナンバーのまま)使っていました。
また、転記する列がM列以降となっていたので、N列以降は転記しないように改めました。
行、列を指定する変数名が多くなりました。(→変数の扱いを再修正しました。)
JavaScript
1function myFunction() { 2 const fr = { //転記元データ 3 rowBegin: 5, //開始行:5行目 4 colBegin: 2, //開始列:B列 5 colEnd: 13, //最終列:M列(この列以降は不要:N列~) 6 colStatus: 5, //ステータスの列:E列 7 colNumber: 7, //番号の列:G列 8 colFillerBegin: 10, //不要な列の開始列:J列 9 colFillerEnd: 12, //不要な列の終了列:L列 10 }; 11 const to = { //転記先データ 12 rowBegin: 4, //開始列:4行目 13 colBegin: 1, //開始列:A列 14 colNumber: 6, //番号の列:F列 15 }; 16 const ss = SpreadsheetApp.getActiveSpreadsheet(); 17 fr.sheet = ss.getSheetByName(FROM_NAME);//← FROM_NAMEを実際の 'シート名' で書換 18 to.sheet = ss.getSheetByName(TO_NAME);//同上 19 //転記元データを二次元配列として取得 20 let fromValues = fr.sheet.getRange(fr.rowBegin, fr.colBegin, fr.sheet.getLastRow() - fr.rowBegin + 1, fr.colEnd - fr.colBegin + 1).getValues(); 21 //確定となっている要素を抽出 22 fromValues = fromValues.filter(v => v[fr.colStatus - fr.colBegin] == '確定'); 23 //転記先の番号の列を一元配列として取得 24 const toValues = to.sheet.getRange(to.rowBegin, to.colNumber, to.sheet.getLastRow() - to.rowBegin + 1, 1).getValues().flat(); 25 //番号が一致している要素を除く 26 if (fromValues.length > 0) { 27 fromValues = fromValues.filter(f => toValues.every(t => t != f[fr.colNumber - fr.colBegin])); 28 } 29 if (fromValues.length > 0) { 30 //不要な列の要素を除く 31 fromValues.forEach(f => f.splice(fr.colFillerBegin - fr.colBegin, fr.colFillerEnd - fr.colFillerBegin + 1)); 32 //転記先シートの最終行の後に追記 33 to.sheet.getRange(to.sheet.getLastRow() + 1, 1, fromValues.length, fromValues[0].length).setValues(fromValues); 34 } 35}
(当初の提案:N列以降も転記される)
JavaScript
1function myFunction() { 2 const ss = SpreadsheetApp.getActiveSpreadsheet(); 3 const shFrom = ss.getSheetByName(FROM_NAME); 4 const shTo = ss.getSheetByName(TO_NAME); 5 //転記元データを二次元配列として取得 6 let vFrom = shFrom.getRange(5, 2, shFrom.getLastRow() - 5 + 1, shFrom.getLastColumn() - 2 + 1).getValues(); 7 //確定となっている要素を抽出 8 vFrom = vFrom.filter(v => v[3] == '確定'); 9 //転記先の番号の列を一元配列として取得 10 const vTo = shTo.getRange(4, 6, shTo.getLastRow() - 4 + 1, 1).getValues().flat(); 11 //番号が一致している要素を除く 12 if (vFrom.length > 0) { 13 vFrom = vFrom.filter(f => vTo.every(t => t != f[5])); 14 } 15 if (vFrom.length > 0) { 16 //不要な列の要素を除く 17 vFrom.forEach(f => f.splice(8, 3)); 18 //転記先シートの最終行の後に追記 19 shTo.getRange(shTo.getLastRow() + 1, 1, vFrom.length, vFrom[0].length).setValues(vFrom); 20 } 21}
投稿2023/07/26 08:26
編集2023/07/27 03:37総合スコア868
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2023/07/27 03:42

退会済みユーザー
2023/07/27 05:21 編集

退会済みユーザー
2023/07/28 00:24 編集

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。