実現したいこと
現在ブックマークレットで特定の操作の後、ブラウテーブルデータを取得し、最後にCSVファイルに保存しようとしていますが、CSV保存のコードを入れるとブックマークレットが機能しません。。。
ブックマークレット①はCSV保存→ダウンロードのコードは入れていないコードで正常に動作します。
ブックマークレット②は①のコードにCSV保存ダウンロードを入れた押しても何も動作しないコードになります。
発生している問題・分からないこと
利用ブラウザ:edge(IEモード)※IEモードが絶対になります。
IEモードのためか、ブックマークレット②を実行して開発者ツールでのコンソールを見ても何も表示がされません。何も実行されないのも謎です。
そのため、何がだめなのかが全く分からず止まっています。また、ファイルダウンロードだけのコードだと実行されるため、②のように組み合わせるとダメであることはわかるのですが、何が干渉し合ってるのかも不明です。。。
もしご教示いただける方がいれば幸いです。
よろしくお願いします。。
該当のソースコード
JavaScript(ブックマークレット①)
1javascript:(function() { 2 // ファイル入力を作成 3 var input = document.createElement('input'); 4 input.type = 'file'; // ファイルタイプを指定 5 input.accept = '.js'; // JavaScriptファイルのみを受け入れる 6 7 // ファイルが選択されたときの処理 8 input.onchange = function(e) { 9 var file = e.target.files[0]; // 選択されたファイルを取得 10 var reader = new FileReader(); // FileReaderを作成 11 12 // ファイルの読み込み完了時の処理 13 reader.onload = function(event) { 14 try { 15 // ファイルの内容を取得 16 var content = event.target.result; 17 // JavaScriptコードから配列を抽出 18 var idData = eval(content.substring(content.indexOf('['), content.lastIndexOf(']') + 1)); 19 20 // 配列の各要素を処理する再帰関数 21 (function search(index) { 22 if (index >= idData.length) return; // インデックスが配列の長さを超えた場合は終了 23 24 var frameDoc = window.frames["A_frame_1"].document; // フレームのドキュメントを取得 25 var ACode = frameDoc.getElementsByName("ACode")[0]; // ACodeの要素を取得 26 var AName = frameDoc.getElementsByName("AName")[0]; // ANameの要素を取得 27 var searchButton = frameDoc.getElementsByName("searchButton")[0]; // 検索ボタンを取得 28 29 // 必要な要素が存在する場合 30 if (ACode && AName && searchButton) { 31 ACode.value = idData[index][0]; // ACodeに値を設定 32 AName.value = idData[index][1]; // ANameに値を設定 33 34 // チェックボックスのリセット 35 ["Flag1","Flag2","Flag3","Flag4","Flag5","Flag6","Flag7","Flag8","Flag9"].forEach(function(name) { 36 var checkbox = frameDoc.getElementsByName(name)[0]; 37 if (checkbox) { 38 checkbox.checked = false; // チェックボックスをオフにする 39 } 40 }); 41 42 frameDoc.getElementsByName("Flag10")[0].checked = true; // 未読フラグをオンにする 43 searchButton.click(); // 検索ボタンをクリック 44 45 // 検索結果の処理 46 setTimeout(function() { 47 executeBookmarklet2(); // 次の処理を実行 48 var checkResults = setInterval(function() { 49 var frame2Doc = window.frames["B_frame_2"].document; // 結果フレームのドキュメントを取得 50 var rows = frame2Doc.querySelectorAll("[id^='row_']"); // 行を取得 51 if (rows.length > 0) { 52 clearInterval(checkResults); // 行が見つかったらチェックを停止 53 search(index + 1); // 次のインデックスで再帰呼び出し 54 } 55 }, 1000); // 1秒ごとにチェック 56 }, 1000); // 1秒待ってから次の処理を開始 57 } 58 })(0); // 検索を最初のインデックスで開始 59 } catch(e) { 60 alert('Error parsing file: ' + e.message); // エラーメッセージを表示 61 } 62 }; 63 64 reader.readAsText(file); // ファイルをテキストとして読み込む 65 }; 66 67 input.click(); // ファイル選択ダイアログを表示 68 69 // フレーム2の処理を実行する関数 70 function executeBookmarklet2() { 71 var select = document.getElementsByName('B_frame_2')[0].contentWindow.document.getElementsByTagName('select')[0]; // セレクト要素を取得 72 if (select) { 73 select.selectedIndex = 1; // セレクトのインデックスを設定 74 if (typeof select.onchange === 'function') select.onchange(); // onchangeイベントを発火させる 75 } 76 } 77})(); 78
JavaScript(ブックマークレット②)
1javascript:(function() { 2 var input = document.createElement('input'); 3 input.type = 'file'; 4 input.accept = '.js'; 5 var csvData = ""; 6 7 input.onchange = function(e) { 8 var file = e.target.files[0]; 9 var reader = new FileReader(); 10 11 reader.onload = function(event) { 12 try { 13 var content = event.target.result; 14 var idData = eval(content.substring(content.indexOf('['), content.lastIndexOf(']') + 1) 15 16 (function search(index) { 17 if (index >= idData.length) { 18 downloadCSV(csvData); 19 return; 20 } 21 22 var frameDoc = window.frames["A_frame_1"].document; 23 var ACode = frameDoc.getElementsByName("ACode")[0]; 24 var AName = frameDoc.getElementsByName("AName")[0]; 25 var searchButton = frameDoc.getElementsByName("searchButton")[0]; 26 27 if (ACode && AName && searchButton) { 28 ACode.value = idData[index][0]; 29 AName.value = idData[index][1]; 30 31 ["Flag1","Flag2","Flag3","Flag4","Flag5","Flag6","Flag7","Flag8","Flag9"].forEach(function(name) { 32 var checkbox = frameDoc.getElementsByName(name)[0]; 33 if (checkbox) { 34 checkbox.checked = false; 35 } 36 } 37 var Flag10 = frameDoc.getElementsByName("Flag10")[0]; 38 if (Flag10) { 39 Flag10.checked = true; 40 } 41 42 searchButton.click(); 43 44 setTimeout(function() { 45 executeBookmarklet2(); 46 var checkResults = setInterval(function() { 47 var frame2Doc = window.frames["B_frame_2"].document; 48 var rows = frame2Doc.querySelectorAll("[id^='row_']"); 49 50 if (rows.length > 0) { 51 clearInterval(checkResults); 52 53 Array.prototype.forEach.call(rows, function(row) { 54 var rowData = Array.prototype.slice.call(row.cells).map(function(cell) { 55 return cell.innerText; 56 }).join(","); 57 58 // CSVデータに追加 59 csvData += AName.value + "," + rowData + "\n"; 60 }); 61 62 search(index + 1); // 次の配列を処理 63 } 64 }, 1000); // 1秒ごとにチェック 65 }, 1000); // 1秒待ってから次の処理を開始 66 } 67 })(0); // 検索を最初のインデックスで開始 68 } catch (e) { 69 alert('Error parsing file: ' + e.message); // エラーメッセージを表示 70 } 71 }; 72 73 reader.readAsText(file); // ファイルをテキストとして読み込む 74 }; 75 76 input.click(); // ファイル選択ダイアログを表示 77 78 // フレーム2の処理を実行する関数 79 function executeBookmarklet2() { 80 var select = document.getElementsByName('B_frame_2')[0].contentWindow.document.getElementsByTagName('select')[0]; // セレクト要素を取得 81 if (select) { 82 select.selectedIndex = 1; // セレクトのインデックスを設定 83 if (typeof select.onchange === 'function') select.onchange(); // onchangeイベントを発火させる 84 } 85 } 86 87 // CSVデータをダウンロードする関数 88 function downloadCSV(csvContent) { 89 var blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' }); // Blobを作成 90 if (window.navigator.msSaveOrOpenBlob) { 91 // IEの場合 92 window.navigator.msSaveOrOpenBlob(blob, 'data.csv'); 93 } else { 94 // その他のブラウザの場合 95 var link = document.createElement('a'); // ダウンロードリンクを作成 96 var url = URL.createObjectURL(blob); // BlobのURLを作成 97 link.setAttribute('href', url); // リンクのhrefにURLを設定 98 link.setAttribute('download', 'data.csv'); // ダウンロードファイル名を設定 99 document.body.appendChild(link); // リンクをDOMに追加 100 link.click(); // リンクをクリックしてダウンロード 101 document.body.removeChild(link); // リンクをDOMから削除 102 } 103 } 104})(); 105 106
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
チャットGPTにも確認しましたが、正常なコードとしか言われませんでした。。
補足
特になし