質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

287閲覧

for文が上手く動作しません。

Banana

総合スコア3

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2022/06/22 08:28

前提

・業務使用中の業務簡略化を目指しています。

当日の朝とその後の業務中に、複数回にわたってシート名[wi_sh]に別のシステムから固まりの記録(200件ほど)を貼り付けます。(このシート内には新旧記録が累積していきます。貼り付け時には重複する内容もあります。)
業務中にもうひとつのシート名[org_sh]に当日利用した物の情報をのせていき、業務終了時に

①[wi_sh]に貼り付けた記録の重複を削除。
②[wi_sh]と[org_sh]を見比べ一致するものを変数内から削除。
(条件:記録の登録日 && 対象名)
③それともうひとつ、[wi_sh]に貼っている記録の中 [ K列 ] に”Yes"と値が入っているものも削除。
この三つの工程を完了し並び替え翌日に備える。
というものを作っているのですが、

どうにもこうにも、想定の動作をしてもらえずどこが原因なのか探りながら書き換えとかを繰り返していたら頭がこんがらがってしまいました。
どうか間違いを教えていただけないでしょうか?
また改善案があればご教授願いたいです。

現状起きたエラー動作は以下の通りです

発生している問題・エラーメッセージ

・問題は②③の時に発生しています。 ・テストで20件の記録を作り動作させましたが、途中途中の記録だけ削除され、実際には[wi_sh]と[org_sh]で一致している記録が残ってしまっている。 ・”Yes"の値が入っている記録も残ってしまっている状態です。

該当のソースコード

Google

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列を左に追加、業務日の日付が入っています。
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ループを回して要素(セル)を削除する場合は、最後からアタマに向かってスキャンし、削除していく、とする必要があります

アタマから順番に行くと、途中で削除すると削除した要素以降が繰り上がって、順番が狂います

投稿2022/06/22 10:32

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Banana

2022/06/22 21:06

y_waiwaiさん アドバイスありがとうございます。 ループの減らす式は今まで書いたことがありませんでしtた。 早速、書き直したのですがうんともすんとも動きません。 もし宜しければ、内容の訂正をお願いします。 //フィルター[submissionDate && name] or [results === "Yes"]一致したら削除 for (var w = wi_Val2.length; w <= 1; w--) { for (var o = org_Val2.length; o <= 1; o--) { if (wi_Val2[w][1].getTime() === org_Val2[o][1].getTime() && wi_Val2[w][4] === org_Val2[o][4]) { wi_Val2.splice([w], 1); break; } }; }; for (var ww = wi_Val2.length; ww <= 1; ww--) { // 'PASTE' if (wi_Val2[ww][10] == "Yes") { wi_Val2.splice([ww], 1); //break; }; };
y_waiwai

2022/06/22 22:21

for (var ww = wi_Val2.length-1; ww >=0; ww--) { // 'PASTE' ですよ 他も同様
Banana

2022/06/24 22:07

y_waiwaiさん ありがとうございます! しっかり動作するようになりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問