下記参照シートのように、メールアドレスの重複を日付が過去のものから削除するプログラムを組みたいのですが私の組んだコードでは正しく動作しません。
メール重複と日付から参照するようにするにはどう良いかわからず質問をさせていただきました。
環境としましてはスプレッドシート内 の[test]というシート上で動作をさせています。
[参照シート]
|名前|メールアドレス|電話番号|日付
|:--|:--:|--:|
|あ|abcde@abcd.com|09000000000|2020/05/25
|い|fghi@klm.com|09012345678|2020/05/25
|う|nopq@rst.com|09010111213|2020/05/25
|あ|abcde@abcd.com|09014151617|2020/05/26
|い|fghi@klm.com|09000000000|2020/05/26
|え|abcde@abcd.com|09000000000|2020/05/26
[希望の処理完了後]
|名前|メールアドレス|電話番号|日付
|:--|:--:|--:|
|う|nopq@rst.com|09010111213|2020/05/25
|い|fghi@klm.com|09000000000|2020/05/26
|え|abcde@abcd.com|09000000000|2020/05/26
[実際の処理完了後]
|名前|メールアドレス|電話番号|日付
|:--|:--:|--:|
|あ|abcde@abcd.com|09000000000|2020/05/25
|あ|abcde@abcd.com|09014151617|2020/05/26
1 2function removeDuplicates(){ 3 var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 4 5 var objSheet = objSpreadsheet.getSheetByName("test"); 6 var sheet = SpreadsheetApp.setActiveSheet(objSheet); 7 sheet.getRange("A:D").sort({column: 4, ascending: false}).removeDuplicates([1]); 8}
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
複雑に考え過ぎだと思います。これだけで十分なはずです。
JavaScript
1function myFunction() { 2 const file = SpreadsheetApp.getActiveSpreadsheet(); 3 const sheet = file.getSheetByName("シート1"); 4 5 const lastRow = sheet.getLastRow(); 6 const lastCol = sheet.getLastColumn(); 7 //ヘッダーを除いたデータ範囲を取得 8 const range = sheet.getRange(2, 1, lastRow - 1, lastCol); 9 //ヘッダーを除いたデータ行を2次元配列として取得 10 const data = range.getValues(); 11 12 //メアドのリスト 13 const emails = data.map((rowData) => rowData[1]); 14 15 //末尾から同じメアドを探して見つかった最初のインデックスと同じインデックスの行のみフィルタ 16 const result = data.filter( 17 (rowData, index, array) => index === emails.lastIndexOf(rowData[1]) 18 ); 19 20 //シートクリアしてから貼り付け 21 range.clear(); 22 sheet.getRange(2, 1, result.length, lastCol).setValues(result); 23} 24
投稿2020/05/26 20:21
総合スコア2577
0
ソートを掛けて重複を弾くというやり方が思いつかず、ガッツリコードを書いてしまいました。
あまりきれいなコードではないので、参考程度にしていただければ幸いです。。
js
1class Teratail265015 { 2 constructor() { 3 this.NAME = 0; 4 this.EMAIL = 1; 5 this.TEL = 2; 6 this.DATE = 3; 7 } 8 9 uniq() { 10 const spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 11 const sheet = spreadsheet.getSheetByName('test'); 12 const range = sheet.getRange(2, 1, sheet.getLastRow(), sheet.getLastColumn()); 13 const sheetValues = range.getValues(); 14 15 const uniqData = []; 16 for (let i = 0; i < sheetValues.length; i++) { 17 const row = sheetValues[i]; 18 19 const name = row[this.NAME]; 20 const email = row[this.EMAIL]; 21 const tel = row[this.TEL]; 22 const date = row[this.DATE]; 23 24 let found = false; 25 for (let j = 0; j < uniqData.length; j++) { 26 const datum = uniqData[j]; 27 28 const uniqDataMs = +(new Date(datum[3])); 29 const dateMs = +(new Date(date)); 30 31 if (datum[1] === email) { 32 found = true; 33 if(uniqDataMs <= dateMs) { 34 // 入れ替え 35 uniqData.splice(j, 1); 36 uniqData.push([name, email, tel, date]); 37 } 38 break; 39 } 40 } 41 42 if (!found) { 43 uniqData.push([name, email, tel, date]); 44 } 45 } 46 47 // データ埋め 48 for (let i = uniqData.length; i < sheetValues.length; i++) { 49 uniqData.push([null, null, null, null]); 50 } 51 52 // データ反映 53 range.setValues(uniqData); 54 } 55} 56 57// 呼び出し部 58function myFunction() { 59 (new Teratail265015()).uniq(); 60}
投稿2020/05/26 10:29
総合スコア26
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/27 02:09
2020/05/27 07:40
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。