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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Google Apps Script

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

Q&A

解決済

2回答

236閲覧

別ファイル内の複数シートから条件に合うセルをコピー先に転記

退会済みユーザー

退会済みユーザー

総合スコア0

Google Apps Script

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

0グッド

0クリップ

投稿2019/07/11 01:48

前提・実現したいこと

以下のコードだと読み込み時間がかかるため、時短化できますでしょうか?

コピー元ファイル内の左から3つ目のシートから最終シートまで検索対象です。
以下の条件に当てはまれば、コピー先シートに転記する処理です。

  1. コピー元シートO列が空欄では無かったら、M列、B列、O列、N列を取得
  2. T列が空欄では無かったら、R列、B列、T列、S列を取得
  3. Y列が空欄では無かったら、W列、B列、Y列、X列を取得

B列は日付の為、最後に日付の昇順に並び替えています。

このコードで結果は表示されるのすが、時間がかかるのと違う方法があるのではないかと考えております。
IFを使って分岐させたらと思っているのですが、どのように書いたらいいのかわからずご教授ください。

GoogleAppsScript

1function dataPP() { 2 const sh2 = SpreadsheetApp.getActiveSpreadsheet(); 3 const sh1 = SpreadsheetApp.openById("XXXXXXXXXXXXXXXXXX")//コピー元ファイル 4 5 const sheet2 = sh2.getSheetByName('データ'); //コピー先 6 const lastRow = sheet2.getLastRow(); 7 const lastCol = sheet2.getLastColumn(); 8 sheet2.getRange(3, 1, lastRow, lastCol).clearContent();//コピー先範囲クリア 9 10 //O列除くデータを判定、M列・B列・O列・N列取得 11 const dat = sh1.getSheets().slice(2).reduce(function(acc, sheet) { 12 return acc.concat(sheet.getDataRange().getValues().slice(2).filter(function(r){return r[14] !== ''}) 13 .map(function(r) {return [r[12], r[1], r[14], r[13]];})); 14 0},[]); 15 //データシート(コピー先)に内容を書き出し 16 sheet2.getRange(3,1, dat.length, 4).setValues(dat);//A3から書き出し 17 18 //T列除くデータを判定、R列・B列・T列・S列取得 19 const dat2 = sh1.getSheets().slice(2).reduce(function(acc, sheet) { 20 return acc.concat(sheet.getDataRange().getValues().slice(2).filter(function(s){return s[19] !== ''}) 21 .map(function(s) {return [s[17], s[1], s[19], s[18]];})); 22 0},[]); 23 24 //データシート(コピー先)に内容を書き出し 25 var endrow = Number(sheet2.getLastRow()) + 1;//最終行取得 26 sheet2.getRange(endrow,1, dat2.length, 4).setValues(dat2);//データシートの最終行に追加 27 28 //Y列空白除くデータを判定、W列・B列・Y列・X列取得 29 const dat3 = sh1.getSheets().slice(2).reduce(function(acc, sheet) { 30 return acc.concat(sheet.getDataRange().getValues().slice(2).filter(function(w){return w[24] !== ''}) 31 .map(function(w) {return [w[22], w[1], w[24], w[23]];})); 32 0},[]); 33 //データシート(コピー先)に内容を書き出し 34 var endrow2 = Number(sheet2.getLastRow()) + 1;//最終行取得 35 sheet2.getRange(endrow2,1, dat3.length, 4).setValues(dat3);//データシートの最終行に追加 36 37 sheet2.getRange(3, 1, lastRow, lastCol).sort(2);//B列を基準に昇順に並び替え 38 }

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

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

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

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

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

macaron_xxx

2019/07/11 04:24

条件1,2,3は重複することがありますか?
退会済みユーザー

退会済みユーザー

2019/07/11 05:08

回答ありがとうございます。 はい、重複することがあります。 条件1~3まで入力されている→条件3を取得 条件1~2まで入力されている→条件2を取得 条件1のみ入力→条件1を取得 このような形になります。
退会済みユーザー

退会済みユーザー

2019/07/11 05:27

すみません、先程の回答に間違いがありました。 条件1~3まで入力されている→条件1・条件2・条件3を取得 条件1~2まで入力されている→条件1・条件2を取得 条件1のみ入力→条件1を取得 こちらになります。大変失礼いたしました。
macaron_xxx

2019/07/12 02:42

ちなみにですが sheet2.getRange(3, 1, lastRow, lastCol).clearContent();//コピー先範囲クリア これだと、lastRowより2つ下の行までクリアしてることになります。(別にそれでも問題は全くないんですが) getRangeの第3引数は行数を表していることだけは理解しといてくださいね。
guest

回答2

0

ベストアンサー

javascript

1function dataPP() { 2 const sh2 = SpreadsheetApp.getActiveSpreadsheet(); 3 const sh1 = SpreadsheetApp.openById("XXXXXXXXXXXXXXXXXX")//コピー元ファイル 4 5 const sheet2 = sh2.getSheetByName('データ'); //コピー先 6 const lastRow = sheet2.getLastRow(); 7 const lastCol = sheet2.getLastColumn(); 8 sheet2.getRange(3, 1, lastRow, lastCol).clearContent();//コピー先範囲クリア 9 10 const full = sh1.getSheets().slice(2).reduce(function(acc, sheet) { 11 return acc.concat(sheet.getDataRange().getValues().slice(2)); 12 },[]); 13 const dat1 = full.filter(function(r){return r[14] !== ''}).map(function(r) {return [r[12], r[1], r[14], r[13]];}); 14 const dat2 = full.filter(function(s){return s[19] !== ''}).map(function(s) {return [s[17], s[1], s[19], s[18]];}); 15 const dat3 = full.filter(function(w){return w[24] !== ''}).map(function(w) {return [w[22], w[1], w[24], w[23]];}); 16 const dat = dat1.concat(dat2).concat(dat3); 17 sheet2.getRange(3,1, dat.length, 4).setValues(dat).sort(2);//B列を基準に昇順に並び替え 18}

あなたもやりたいことを小出しにするタイプのかたでしたか。

投稿2019/07/11 13:50

papinianus

総合スコア12705

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

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

退会済みユーザー

退会済みユーザー

2019/07/12 00:36

大変ご迷惑をお掛けしすみません。 今後は初めの段階から必要項目は全て記載するよういたします。 ご回答ありがとうございました。
guest

0

重複しないならこんな感じでいけるんじゃないでしょうか?

・優先順位有

GAS

1const dat = sh1.getSheets().slice(2).reduce(function(acc, sheet) { 2 return acc.concat(sheet.getDataRange().getValues().slice(2).filter(function(r){return r[14] !== '' || r[19] !== '' || r[24] !== ''}) 3 .map(function(r) { 4 if (r[24] !== '') return [r[22], r[1], r[24], r[23]]; 5 if (r[19] !== '') return [r[17], r[1], r[19], r[18]]; 6 if (r[14] !== '') return [r[12], r[1], r[14], r[13]]; 7 return []; 8 })); 9},[]); 10//データシート(コピー先)に内容を書き出し 11sheet2.getRange(3,1, dat.length, 4).setValues(dat);//A3から書き出し

投稿2019/07/11 04:53

編集2019/07/11 05:11
macaron_xxx

総合スコア3191

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問