前提・実現したいこと
以下のコードだと読み込み時間がかかるため、時短化できますでしょうか?
コピー元ファイル内の左から3つ目のシートから最終シートまで検索対象です。
以下の条件に当てはまれば、コピー先シートに転記する処理です。
- コピー元シートO列が空欄では無かったら、M列、B列、O列、N列を取得
- T列が空欄では無かったら、R列、B列、T列、S列を取得
- 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 }
条件1,2,3は重複することがありますか?
回答ありがとうございます。
はい、重複することがあります。
条件1~3まで入力されている→条件3を取得
条件1~2まで入力されている→条件2を取得
条件1のみ入力→条件1を取得
このような形になります。
すみません、先程の回答に間違いがありました。
条件1~3まで入力されている→条件1・条件2・条件3を取得
条件1~2まで入力されている→条件1・条件2を取得
条件1のみ入力→条件1を取得
こちらになります。大変失礼いたしました。
ちなみにですが
sheet2.getRange(3, 1, lastRow, lastCol).clearContent();//コピー先範囲クリア
これだと、lastRowより2つ下の行までクリアしてることになります。(別にそれでも問題は全くないんですが)
getRangeの第3引数は行数を表していることだけは理解しといてくださいね。
回答2件
あなたの回答
tips
プレビュー