前提・実現したいこと
Google Apps Scriptで
シートAを参照してシートBに文字列を記載するスクリプトを制作しています。
ネットで調べた情報を参考に、スクリプト自体は理想の動作で
なんとか動かすことができたのですが、処理をループさせる方法で悩んでいます。
シートA、K列最終行の次の行から処理を開始して、
処理の最後に、シートA、K列に日付を記載するまでを1セットで、
処理をループさせたいです。
該当のスプレッドシート
該当のソースコード
GoogleAppScript
1function myFunction() { 2// ① [ sheetA ] [ sheetB ] を取得 3 var ss = SpreadsheetApp.getActiveSpreadsheet(); 4 var csv = ss.getSheetByName('sheetA') 5 var prc = ss.getSheetByName('sheetB') 6 7//② シートの最終行を取得 8 const LastRow = csv.getLastRow(); //シートのデータが入力されている最終行を取得 9 10//③ K列 最終行を取得 11 const kLastRow = csv.getRange(1,11).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); 12 13//④A列 > K列の場合処理を行う 14var remRow = LastRow - kLastRow; 15 16//処理を行う行 kLastRow+1 17var prcRow = kLastRow + 1; 18//⑤ kLastRow+1のF列を参照、セルの情報を取得 [ 文字列 ] 19var fCol = csv.getRange(prcRow,6).getValue(); 20 21//⑥ prcRowのA列を参照、セルの情報を取得 [ 年月 ] 22var aCol = csv.getRange(prcRow,1).getValue(); 23var aColD = new Date(aCol); 24var aColY = Utilities.formatDate(aColD,"JST","yy年MM月"); 25 26//⑦ prcRowのC列を参照、セルの情報を取得 [ 文字列 ] 27var cCol = csv.getRange(prcRow,3).getValue(); 28 29//⑧ 2行目の特定名の列を検索して返す関数を定義 30 function colSearch(label) { 31 for (i = 1; i <= prc.getLastColumn(); i++) { 32 if (prc.getRange(2, i).getValue() == label) { 33 return i; 34 } 35 } 36 } 37//⑨ 行を検索して返す関数を定義 38 function rowSearch(label) { 39 for (i = 1; i <= prc.getLastRow(); i++) { 40 if (prc.getRange(i, 1).getValue() == label) { 41 return i; 42 } 43 } 44 } 45//⑩ colSearchでaColを元に[ sheetB ]の列を検索して返す(yy/MMの一致:日付は一致不要) 46var refCol = colSearch(aColY); 47//⑪ rowSearchでfColを元に[ sheetB ]の行を検索して返す 48var refRow = rowSearch(fCol); 49 50//⑫ ⑩⑪で取得したrefCol、refRowを元にセルを指定し、決定した処理内容を反映 51 if ( cCol == "AAAA") { 52 prc.getRange(refRow,refCol).setValue("処理A") 53 } else if ( cCol == "BBBB") { 54 prc.getRange(refRow,refCol).setValue("処理A") 55 } else if ( cCol == "CCCC") { 56 prc.getRange(refRow,refCol).setValue("処理B") 57 } 58 59//⑬ 処理完了後、[ sheetA ] K列 に反映日時を記載 60const today = new Date(); 61var setDate = Utilities.formatDate(today,"JST","MM/dd"); 62csv.getRange(prcRow,11).setValue(setDate) 63}
試したこと
for(i=1,i>=LastLow,i++){
if(remRow>0){
var prcRow = kLastRow + i;
・・・
}else{break;
}
ネットでループ処理について調べて、
上記のような形で実装を試みましたが、
remRowの値が大きくなりすぎたり、
1行を処理するだけで終わってしまったり
未だにうまく実装できていません。
GASどころか、コーディング初心者で
意味不明な書き方をしている部分もあるかと思いますので、
大変恐縮なのですが、自分だけで解決できそうになかったので質問させていただきました。
何卒、ご教授いただけますと幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/01 04:07