前提
・業務使用中の業務簡略化を目指しています。
当日の朝とその後の業務中に、複数回にわたってシート名[wi_sh]に別のシステムから固まりの記録(200件ほど)を貼り付けます。(このシート内には新旧記録が累積していきます。貼り付け時には重複する内容もあります。)
業務中にもうひとつのシート名[org_sh]に当日利用した物の情報をのせていき、業務終了時に
①[wi_sh]に貼り付けた記録の重複を削除。
②[wi_sh]と[org_sh]を見比べ一致するものを変数内から削除。
(条件:記録の登録日 && 対象名)
③それともうひとつ、[wi_sh]に貼っている記録の中 [ K列 ] に”Yes"と値が入っているものも削除。
この三つの工程を完了し並び替え翌日に備える。
というものを作っているのですが、
どうにもこうにも、想定の動作をしてもらえずどこが原因なのか探りながら書き換えとかを繰り返していたら頭がこんがらがってしまいました。
どうか間違いを教えていただけないでしょうか?
また改善案があればご教授願いたいです。
現状起きたエラー動作は以下の通りです
発生している問題・エラーメッセージ
・問題は②③の時に発生しています。 ・テストで20件の記録を作り動作させましたが、途中途中の記録だけ削除され、実際には[wi_sh]と[org_sh]で一致している記録が残ってしまっている。 ・”Yes"の値が入っている記録も残ってしまっている状態です。
該当のソースコード
1function CleanUp() { 2 3 var col_A = "A" 4 var col_B = "B" 5 var col_K = "K" 6 var col_L = "L" 7 8 var ss = SpreadsheetApp.getActiveSpreadsheet(); 9 const wi_sh = ss.getSheetByName('Walk In'); 10 const org_sh = ss.getSheetByName('Original Daily Report'); 11 12 const wi_Val = wi_sh.getRange(col_A + "2:" + col_L + wi_sh.getLastRow()).getValues(); 13 const org_Val = org_sh.getRange(col_B + "4:" + col_K + org_sh.getLastRow()).getValues(); 14 15 16 //配列内_重複削除 17 const wi_Val2 = wi_Val.filter(function (i) { 18 if (!this[i[1]]) { 19 return this[i[1]] = true; 20 } 21 }); 22 //配列1番目[submissionDate]で空白か判定 >> 値行だけ抽出 23 const org_Val2 = org_Val.filter(v => v[1]); 24 25 //フィルター[submissionDate && name] or [results === "Yes"]一致したら削除 26 for (var w = 0; w < wi_Val2.length; w++) { 27 for (var o = 0; o < org_Val2.length; o++) { 28 if (wi_Val2[w][1].getTime() === org_Val2[o][1].getTime() && wi_Val2[w][4] === org_Val2[o][4]) { 29 wi_Val2.splice(wi_Val2[w], 1); 30 break; 31 } 32 }; 33 }; 34 35 for (var ww = 0; ww < wi_Val2.length; ww++) { // 'PASTE' 36 if (wi_Val2[ww][10] == "Yes") { 37 wi_Val2.splice(wi_Val2[ww], 1); 38 break; 39 }; 40 }; 41 42 //配列内2番目の日付を基準に降順ソート 43 wi_Val2.sort(function (a, b) { return new Date(b[1]) - new Date(a[1]) }); 44 45 //sheet clearして貼り直し 46 wi_sh.getRange(col_A + "2:" + col_L + wi_sh.getLastRow()).clear(); 47 wi_sh.getRange(col_A + "2:" + col_L + (wi_Val2.length + 2 - 1)).setValues(wi_Val2); 48 49 //値のある行を全非表示 50 //wi_sh.hideRows(2, numRow - 1); 51 52 53};
試したこと
・思いつくことは手当たり次第試したのですが、惨敗でした。
・このスクリプトでは②③をそれぞれのFOR文でループさせていますが、その前に試した内容があります、もしよろしければこの内容の確認もお願いします。
この内容も動作しない理由がわからなかったのですが、この不具合の原因はFORが二重になっているからなのでしょうか?
for (var w = 0; w < wi_Val2.length; w++) {
for (var o = 0; o < org_Val2.length; o++) {
if (wi_Val2[w][1].getTime() === org_Val2[o][1].getTime() && wi_Val2[w][4] === org_Val2[o][4] || wi_Val2[ww][10] == "Yes" ) {
wi_Val2.splice(wi_Val2[w], 1);
break;
}
};
};
補足情報(FW/ツールのバージョンなど)
[wi_sh]イメージです。
[org_sh]
業務中に入力するシートは[wi_sh]の中身L列を削り、A列を左に追加、業務日の日付が入っています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/06/22 21:06
2022/06/22 22:21
2022/06/24 22:07