GAS初心者ですが、よろしくお願いします
2500程度の行数と7列のあるデータを扱います
1行目がタイトルです
各行にコピー先を示すキーが6列目と7列目にあります
例えば、
2行目にはAとD
3行目にはBのみ
4行目にはAとC のような感じです
6列目には必ずキーがあるのですが、7列目のキーは4分の1程度が空欄です
コピーしたいデータはキーの手前までの2500行×5列です
キーは別シートで一覧にしてあり、for構文でひとつずつ順番に呼び出して、該当する行をコピー先にコピーしたいです
データの分量があり、setValuesでデータをコピーしていきましたが、500行くらいで6分の壁にぶつかり、スクリプトを終了することができませんでした
次に、配列ごとコピーできれば処理速度が上がると思い、pushを使用してみましたがうまくいきませんでした
サンプルデータに2つの異なるキーを用意してAのキーは2行分、Bのキーは3行分になるようにしました
Logger.log(data[j])で得られる結果は、
[Aに該当する配列で1つ目の行]
[[Aに該当する配列で1つ目の行][Aに該当する配列で2つ目の行]]
[]
[Bに該当する配列で1つ目の行]
[[Bに該当する配列で1つ目の行][Bに該当する配列で2つ目の行]]
[[Bに該当する配列で1つ目の行][Bに該当する配列で2つ目の行][Bに該当する配列で3つ目の行]]
[]
という感じで出力されました
最初からキーに該当するデータが二次元配列で取得することができれば、データのコピーの時間が短縮できるのではないかと考えてこのように挑戦しましたが、うまくいきませんでした
また、各キーに該当するデータを抽出した後、空欄の配列が出力されている意味がわからなかったので、ご教授いただけるとありがたいです
あとは、最後まで辿り着けていないのですが、コピー先の「データ保管」というシートのgetLastRow()+1に二次元配列ごとコピーしたいと思っているのですが、貼り付けるデータの行数を指定しなくてはならないと思うのですが、いろんなデータを.lengthで表示してみましたが、今回の2や3という結果を得ることができませんでした
よろしくお願い致します
GAS
1function myFunction() { 2 //コピー元になるデータを取得 3 var ss = SpreadsheetApp.openById('コピー元ID'); 4 var sh = ss.getSheetByName('コピー元シート名'); 5 var _lastRow = sh.getLastRow(); 6 var data = sh.getRange(2,1,_lastRow,7).getValues(); 7 8 9//以下の4行をマスターデータの保管用として挿入しました(5/4) 10 var copymasterdata = sh.getRange(2,1,_lastRow,5).getValues(); 11 var copymastersh = ss.getSheetByName('マスターデータ保管'); 12 var _lastRowmasterPlus1 = copymastersh.getLastRow()+1; 13 14 copymastersh.getRange(_lastRowmasterPlus1,1,copymasterdata.length,5).setValues(copymasterdata); 15 16 var classidsh = ss.getSheetByName('キーとなる別シートのID'); 17 var classiddata = classidsh.getDataRange().getValues(); 18 19 for (var i = 0 ; i < classiddata.length ; i++){ 20 var classid = classiddata[i][0]; 21 22 Logger.log(classid); 23 24 var copydata = []; 25 for (var j = 0 ; j < data.length ; j++){ 26 if(data[j][5] == classid){ 27 copydata.push(data[j]) 28 29 Logger.log(data[j]); 30 Logger.log(copydata); 31 32 var copyss = SpreadsheetApp.openById(classid); 33 var copysh = copyss.getSheetByName('データ保管'); 34 var copy_lastRowPlus1 = copysh.getLastRow()+1; 35 } 36 } 37 38//以下の7行をコピー終了後に1日で回収したデータを削除して、また翌日分を改めてデータ回収するように削除のスクリプトと、埋め込み関数のスクリプトを挿入しました(5/4) 39//Logger.log(_lastRow); 40 sh.deleteRows(2,_lastRow-1); 41 42 //二次元配列に埋め込む関数をセット 43 var formformula = [ 44 [ 45 `=arrayformula(vlookup(B2:B,'名簿'!A:J,10,0))`, 46 `=arrayformula(vlookup(B2:B,'名簿'!A:K,11,0))` 47 ] 48 ]; 49 50 //関数を埋め込む 51 sh.getRange(2,6,1,2).setValues(formformula); 52 53 }
2021/5/6 09:24 追記
5/4の夜はデータがすべてのシートに書き出されている様子でしたが、5/5の夜は全部コピーできていない様子でした。
スクリプトのエラーが出ていたのでそちらも載せます
起動
21/05/04 23:21
関数
myFunction
エラー メッセージ
同時呼び出しの数が多すぎます: スプレッドシート
トリガー
time-based
End
21/05/04 23:33
トリガーで動き出してから、すぐにエラーが出ているので、私が書き足した部分が問題になっているのではないかと思います。ただ、5/4の夜はこのスクリプトで問題なく動きましたが、5/5の夜はダメでした
確認していただけるとありがたいです
2021/5/3 08:57追記
元データと呼んでいるデータは以下のようなスタイルで、A列からE列まではGoogleフォームでの回答結果です。
F列とG列には、別シートからarrayformula(vlookup)という関数が2行目に入っており、回答がされていくと同時に所属するシートIDが割り当てられるようにしてあります
F列とG列は重複しないそれぞれのグループからのIDが割り当てられています
F列はAグループの57個のIDがあります
G列はBグループの53個のIDがあります
したがいまして、F列はAグループから、G列はBグループからIDを検索した方がスピードアップできそうなイメージはあったのですが、どうして良いのかわからなかったので、AグループとBグループのIDをまとめてA列に並べて、A列1列のみのIDシート(classidsh)を現在は利用しています。
回答1件
あなたの回答
tips
プレビュー