Q&A
前提
・親フォルダ直下にマージファイルがあり、そこにGASを登録。
・子フォルダ内にGAS処理をしたいファイルが複数入っています。
フォルダ内の全ファイルに対し、総あたりでGAS処理をしたい。
<GAS処理内容>
子フォルダ内のファイルの内容の一部を抜粋し、
親フォルダ直下のマージファイルの指定シート※にコピーしたい。
※転記先シートは全4種。
工程①マージ、工程②マージ、二次マージ、ALLマージ
各シートへの転記PGMはそれぞれ独立したfunctionとし、
別のボタンに割付しています。
(コピー元イメージ)
(マージファイルイメージ)
やりたいこと
子フォルダ内で総あたり処理する際、ファイル名順等 決まった
順番で処理したい。
(例)
ファイル1(No111111)、ファイル2(No222222)、ファイル3(No333333)
の3ファイル格納の場合毎回、左→右の順で
ファイル1→ファイル2→ファイル3とマージファイルに転記してほしい。
発生している問題
動作確認の際、タイミングの問題なのか処理順が
1→2→3
2→3→1 等 変化し、安定しない。
処理順を指定してGAS処理をさせることは可能でしょうか?
それとも、その時の回線? 等の状況次第のため、処理順の
コントロールは難しいので、いったん処理順を気にせず、
マージシートに書き出し、あとで整える方が確実でしょうか?
後者の場合、丸投げで大変申し訳ありませんが、
列方向でソートをかける方法が思いつきません。
何かよい方法がないかアドバイスをいただけないでしょうか?
該当のソースコード
以下、工程①マージシートへの転記処理のコード全文です。
GAS
1function copyToMergeSheet() { 2 3 //▼転記元ファイルの指定 4 //Ss変換済フォルダ内の全ファイルをSsFilesとして取得 5 //Ss変換済フォルダのフォルダID FromfIdはxlsToSs変換処理用ファイルprocessSsのはじめにシート_セルC10 6 7 //xlsToSs変換処理用ファイル 8 //https://docs.google.com/spreadsheets/d/ 省略 /edit#gid=1045004046 9 //ファイルID:省略 10 const processSs = SpreadsheetApp.openById(' 省略 '); 11 const FromfId = processSs.getSheetByName('はじめに').getRange(10, 4, 1, 1).getValue(); 12 console.log('FromfId ' + FromfId); 13 14 //Ss変換済フォルダFromFolId内の全ファイルをSsFilesとして取得 15 const SsFiles = DriveApp.getFolderById(FromfId).getFiles(); 16 17 //const FromSheet = PrimSs.getSheets)[0]; //左から1番目のシート 18 19 //▼転記先ファイル、シートの指定★変更要★ 20 const ToSs = SpreadsheetApp.getActiveSpreadsheet(); 21 const ToSheet = ToSs.getSheetByName('工程①'); 22 23 while (SsFiles.hasNext()) { 24 const file = SsFiles.next(); //順番にファイルを処理 25 const FromSheet = SpreadsheetApp.open(file).getSheets()[0]; 26 27//▼転記元ファイルのシート名の変更 28//シート名はセルS1から取得 29//getRange(行目,列目,行分,列分) 30const Name = FromSheet.getRange(1,19,1,1).getValue(); 31console.log('Name ' + Name); 32FromSheet.setName(Name); 33 34//▼氏名を転記先シートセルE5以降に転記 35const lastCol = ToSheet.getLastColumn(); 36console.log('lastCol '+ lastCol); //D列=4が正解 37 38//5行目データあり最終列に氏名を転記 39ToSheet.getRange(5,lastCol+1,1,1).setValue(Name); 40 41//▼Noを転記先シートセルE4以降に転記 42//Noは転記元ファイルのセルK1から取得 43//getRange(行目,列目,行分,列分) 44const empNo = FromSheet.getRange(1,11,1,1).getValue(); 45console.log('empNo '+ empNo); 46ToSheet.getRange(4,lastCol+1,1,1).setValue(empNo); 47 48//6行目に工程①氏名を転記 49//工程①氏名は転記元ファイルのセルAC3から取得 50const TL = FromSheet.getRange(3,29,1,1).getValue(); 51console.log('工程① '+ 工程①); 52ToSheet.getRange(6,lastCol+1,1,1).setValue(TL); 53 54//▼項目結果の転記 55//項目#1~#25までを二次元配列RateArr0としてまとめて取得 56//取得範囲はセルZ6:Z38 57const RateArr0 = FromSheet.getRange(6,26,36,1).getValues(); 58console.log('RateArr0 ',RateArr0); 59 60//二次元配列RateArr0のデータなし空白行を.filter() .map()で削除し 61//新配列RateArr1を生成 62const RateArr1 = RateArr0.filter(([v]) => v).map(row => row.filter(v => v)); 63console.log('RateArr1 ', RateArr1); 64 65//新配列RateArr1をToSheetセルE7以降に転記 66ToSheet.getRange(7,lastCol+1,27,1).setValues(RateArr1); 67 68//▼総合評価の転記 69//工程①総合評価は転記元ファイルのセルZ3から取得 70const sogoRate = FromSheet.getRange(3,26,1,1).getValue(); 71console.log('sogoRate '+ sogoRate); 72ToSheet.getRange(34,lastCol+1,1,1).setValue(sogoRate); 73 74} 75//▼完了Msgの表示 76SpreadsheetApp.flush(); 77Browser.msgBox("マージシートへの転記が完了しました。",Browser.Buttons.OK); 78} 79 80
試したこと
マイドライブ内でマージファイルや親フォルダ、子フォルダの
格納場所を変えてみてトライしましたが、安定して1→2→3の順で
処理をさせることができません。
補足情報
検索したところ以下質問が類似かと思い、参照しましたが、
自己解決には至りませんでした。
→Q220684)
はじめにシートのイメージは下リンク先参照
リンク
次回から自己解決できるようになりたいので、
お忙しいところ申し訳ありませんが、
非エンジニアビギナーでも理解できるレベルでの解説、
アドバイスをお願いします。
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2023/03/27 23:38 編集
2023/03/28 01:45
2023/03/28 01:46
2023/03/28 01:57
2023/03/28 02:00
2023/04/01 03:40
2023/04/01 03:43
2023/04/01 03:51
2023/04/01 03:58
2023/04/01 04:01
2023/04/01 04:04
2023/04/01 04:09