- 題名・名前・本文は必ず入力してください。
 - 題名は、できれば具体的な本文内容がイメージできるものにしてください。
 - スパムよけのため、本文中に句読点記号が含まれていない場合にはエラーとなります。 「,」「.」ではなく「、」「。」を使ってください。
 - [バグ][要望][質問][済][未] の分類は管理人が後から勝手に付加しています。 書き込み時は意識する必要はありません。
 
[884] 重複確認について
みかん [2025/01/10 13:16:35]
重複確認について。
12列目と14列目に重複がない場合に行を削除するという
マクロを組むことは可能でしょうか。
Re: [884] 重複確認について
みかん [2025/01/10 17:21:39]
// 12列目と14列目の値の組み合わせを記録するオブジェクトを初期化(プロトタイプなし)
let seen = Object.create(null);
// データの最終行から2行目までを逆順に処理
for (let row = Bottom; row >= 2; row--) {
    // 12列目と14列目の値を取得し、文字列として正規化(トリムと小文字化)
    let col12 = String(cell(12, row)).trim().toLowerCase();
    let col14 = String(cell(14, row)).trim().toLowerCase();
    // 12列目と14列目の組み合わせをキーとして連結
    let key = col12 + '|' + col14;
    // デバッグ用にキーをコンソールに出力
    console.log(`Processing row ${row}: key = "${key}"`);
    // 既に同じ組み合わせが存在する場合、その行を削除
    if (seen.hasOwnProperty(key)) {
        console.log(`Duplicate found. Deleting row ${row}`);
        DeleteRow(row);
    } else {
        // 新しい組み合わせの場合、オブジェクトに追加
        seen[key] = true;
        console.log(`Adding key "${key}" to seen`);
    }
}
若干1行残ってしまうのですが、
チャットGPTに出させたコードです。
どこがおかしいか全くわからず断念しました。
ジェネレーターでDLして使ったのですが、
例えば別のPCから挙動確認しようとしても。
L1 C1のエラーが起きます。
どの様にりようしたらいいでしょうか。
Re: [884] 重複確認について
あすかぜ [2025/01/10 22:30:23]
貼りつけていただいたコードを、Cassava Editor で動作するように書き直してみました。
こちらを試してみてください。
https://www.asukaze.net/soft/cassava/macro/asukaze/bbs884_20250110.cms
・Object.create() は使えないので {} としてください。
・a.hasOwnProperty(b) は使えないので b in a としてください。
・String() は使えないので str() としてください(.trim() に続ける場合は不要です)。 
・console.log() は使えません。
・テンプレート文字列(`...`)は使えません。
このマクロは、「12列目と14列目が同じ内容であるような行が複数ある場合、最後の 1 行だけを残してそれ以外を削除する」
という挙動になっています。「重複がない場合に行を削除」とは違うかもしれませんが、大丈夫でしょうか。
また、このマクロは Ver.2.3 以降のみで動作する書き方となっています。
古いバージョンを使っている場合、最新版への更新をお願いします。
Re: [884] 重複確認について
みかん [2025/01/12 13:55:53]
お返事ありがとうございます。
実行させていただいたのですが、
やはり一行残ってしまいました。
元データ
 12列目 14列目
 1大阪 田中太郎
 2大阪 田中太郎
 3東京 田中太郎
 4大阪 田中次郎
 5大阪 田中太郎
 6大阪 田中三郎
 7香川 田中太郎
 8大阪 田中太郎
 9京都 田中太郎
 10大阪 田中太郎
 ↓ (実行)
1、3、4、6、7、9、10 行目
が残ります。
1、3、4、6、7、9のは差異があるのでOKなのですが、
10が残ってしまうので困っています。
確認頂けると幸いです。
宜しくお願いいたします。
Re: [884] 重複確認について
みかん [2025/01/12 14:10:22]
すみません。まさに指摘いただいている挙動なので、
変えてもらえると助かります。
>このマクロは、「12列目と14列目が同じ内容であるような行>が複数ある場合、最後の 1 行だけを残してそれ以外を削除>する」
>という挙動になっています。「重複がない場合に行を削除」>とは違うかもしれませんが、大丈夫でしょうか。
Re: [884] 重複確認について
みかん [2025/01/12 14:20:09]
何度もすみません。
実行できました。ありがとうございます。
このコードをリンクにしてもらえると幸いです。
// (12列目,14列目)の組み合わせ回数を記録するためのオブジェクト
counts = {};
// ■第一段階: 上から走査してカウント
for (row = 2; row <= Bottom; row++) {
    col12 = cell(12, row).trim().toLowerCase();
    col14 = cell(14, row).trim().toLowerCase();
    key   = col12 + "|" + col14;
    // カウントアップ
    if (key in counts) {
        counts[key] = counts[key] + 1;
    } else {
        counts[key] = 1;
    }
}
// ■第二段階: 下から走査して削除
for (row = Bottom; row >= 2; row--) {
    col12 = cell(12, row).trim().toLowerCase();
    col14 = cell(14, row).trim().toLowerCase();
    key   = col12 + "|" + col14;
    // もし2回以上出現している組み合わせなら削除
    if (counts[key] > 1) {
        DeleteRow(row);
    }
}
Re: [884] 重複確認について
あすかぜ [2025/01/12 21:28:32]
上のコードをそのまま .cms ファイルにしたリンクです。
https://www.asukaze.net/soft/cassava/macro/mikan/bbs884_20250112.cms
Windows 上では、.cms ファイルは「メモ帳」などのテキストエディタで編集してください。
このマクロも前回のマクロも、処理の対象が 2 行目からデータ末尾までとなっています。
1 行目のデータも処理対象としたい場合には、
for (row = 2; row <= Bottom; row++) {
を
for (row = 1; row <= Bottom; row++) {
に、
for (row = Bottom; row >= 2; row--) {
を
for (row = Bottom; row >= 1; row--) {
に、
それぞれ変更してください。
Re: [884] 重複確認について
みかん [2025/01/13 22:45:20]
何とかできました。
ご助言ありがとうございます
// ▼(12,14)列目の「最初に出現した行」を覚えておくマップ
firstRowForKey = {};
// ▼第1段階: 上から下へ走査して「最初に出現した行」を記録
for (r = 1; r <= Bottom; r++) {
    col12 = cell(12, r).trim().toLowerCase();
    col14 = cell(14, r).trim().toLowerCase();
    key   = col12 + "|" + col14;
    // まだ記録されていなければこの行番号を覚える
    // (すでにあれば何もしない → 先に出た行が「最初」)
    if (!(key in firstRowForKey)) {
        firstRowForKey[key] = r;
    }
}
// ▼第2段階: 下から上へ走査して「最初に出現した行以外」を削除
for (r = Bottom; r >= 1; r--) {
    col12 = cell(12, r).trim().toLowerCase();
    col14 = cell(14, r).trim().toLowerCase();
    key   = col12 + "|" + col14;
    // 「このキーの最初の行」ではない場合は削除
    if (r != firstRowForKey[key]) {
        DeleteRow(r);
    }
}
Re: [884] 重複確認について
あすかぜ [2025/01/14 21:21:18]
解決したようでよかったです。