
ある業務システムのページ(https://)に
業務で使用するCSVファイルダウンロードのリンクが20個ほど列挙されています。
(しかしURLは、・・・/abcd.csv ではなく、/スラッシュで終わってますが、クリックするとcsvが自動的にDLされる)
普段のルーチン作業で使うのは、この中のある6つのファイルだけなので、
選びやすく誤クリックを防ぐため、対象のリンクだけに絞ったHTMLをローカルに保存して使用しています。
そのやり方は、本物のサイトを「名前を付けてページを保存」でHTML(完全)でローカルに保存し、
HTMLを編集しました。
手順としては、一度本番サイトにログインをしておいてから、
デスクトップにおいてあるHTMLファイルを開き、6つのリンクを上から順番にクリックすると、
ダウロードフォルダにcsvが落ちてくる仕組みにしています。
この作業をもっと楽にするためにお知恵を貸してください。
・たとえば1ボタンをクリックするだけで6つともDLできるとか
・ログイン情報もHTMLに入れておいてログインも自動にするとか
このシステムはPassの保存ができなくなっているため、
一度入力したIDはプルダウンから選択できますが、Passは毎回手入力しなければいけません。
事前にログインしておかずにローカルHTMLからリンクをクリックすると、新しいタブにログイン画面が表示されるようになっています。
A 回答 (11件中1~10件)
- 最新から表示
- 回答順に表示
No.11
- 回答日時:
>No.10 回答者: amanojaku6
そのページがクライアント(自分のPCのHDD)にある場合、正常に動作しません。
そのページをサーバー上にアップして下さい。
No.10
- 回答日時:
このスクリプトはポップアップしません。
ブラウザは必ずChromeにして下さい。
ファイルをダウンロード可能です(サーバーからMimeTypeを取得しているので、大抵のファイル拡張子なら問題でしょう)。
リンクをクリックする必要はありません。
ファイルの設定はDownloadFileList = ["images008.jpg", "images009.jpg", "images010.jpg"]です、この「"images008.jpg", "images009.jpg", "images010.jpg"」を変更して下さい。
一気に複数のファイルをダウンロードするので、ファイル・サイズが大きいと問題が発生するかもしれません。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS">
<title>Sample</title>
</head>
<body>
<script type='text/javascript'>
// ブラウザは必ずChromeにして下さい。
// 一気に複数のファイルをダウンロードするので、ファイル・サイズが大きいと問題が発生するかもしれません。
DownloadFileList = ["images008.jpg", "images009.jpg", "images010.jpg"];
FileDownload = function(DownloadFile) {
this.DownloadFile = DownloadFile;
};
FileDownload.prototype.DownloadAnchorClick = function() {
this.DownloadAnchor.click();
};
FileDownload.prototype.CreateDownloadNoneTag = function() {
this.DownloadAnchor = document.createElement("a");
this.DownloadAnchor.style.display = 'none';
document.body.appendChild(this.DownloadAnchor);
this.DownloadAnchor.href = 'JavaScript:;';
this.DownloadAnchor.download = this.DownloadFile;
this.DownloadAnchor.onclick = this.FDownload();
};
FileDownload.prototype.FLoad = function(url) {
let content;
this.DownloadHttpReq = new XMLHttpRequest();
this.DownloadHttpReq.open( "GET", url, false );
this.DownloadHttpReq.overrideMimeType('text\/plain; charset=x-user-defined');
// MIME タイプを上書きしてブラウザーに強制的に、ユーザー定義の文字セットを使用したプレインテキストとして扱わせます。
// これにより、ブラウザーはこれを解釈せず、未処理のままバイト列を通します。
this.DownloadHttpReq.send(null);
content = this.DownloadHttpReq.responseText;
if( this.DownloadHttpReq.status==200 ) this.DownloadMimeType = this.DownloadHttpReq.getResponseHeader('content-type');
else content = null;
return content;
};
FileDownload.prototype.FDownload= function() {
let BinaryArray = StringToBinaryArray(this.FLoad(this.DownloadFile));
let blob = new Blob([BinaryArray], {type: this.DownloadMimeType});
if (window.navigator.msSaveBlob) {
window.navigator.msSaveBlob(blob, this.DownloadFile);
// msSaveOrOpenBlobの場合はファイルを保存せずに開ける
window.navigator.msSaveOrOpenBlob(blob, this.DownloadFile);
} else {
this.DownloadAnchor.href = window.URL.createObjectURL(blob);
}
}
FileDownloadObjList = new Array(DownloadFileList.length);
for( let i = 0; i<FileDownloadObjList.length; i++ ){
FileDownloadObjList[i] = new FileDownload(DownloadFileList[i]);
FileDownloadObjList[i].CreateDownloadNoneTag();
FileDownloadObjList[i].DownloadAnchorClick();
}
function StringToBinaryArray(s) {
let buf = new ArrayBuffer(s.length);
let BinaryInterface = new Uint8Array(buf);
for (let i=0; i<s.length; i++) {
BinaryInterface[i] = s.charCodeAt(i);
}
return buf;
}
</script>
</body>
</html>
No.9
- 回答日時:
> あとはダウンロードまでVBAで行えるかなのですが、
> DL.html を開いて、補足に記載している「すべてダウンロード」をクリックさせるのをVBAでで
> きないでしょうか?
> もちろん方法が変わっても構いません。
これは【基本的には】出来ないと考えてください。
なぜならこれは、ダウンロードに限ってのみVBAから操作しようとしているからです。
理由や対応方法は後述しますが、回答を書いている最中に状況を鑑みて、なんか出来そうな気がしてきました。
もしかして、ログインしていなくてもダウンロードできるほどザルなのでは?と思って。
試しにVBAで新規ブラウザを操作し、『すべてダウンロード』のページにナビゲーションさせ、DOM操作でリンククリックさせてみてください。
以下ページなどを参考に。
https://vba-code.net/ie/click-a-link/
正規ルートでログインしていても、ログインしていないとみなされてうまくいかないなら、後述する案1、案2などの方法を取らなければ実現することはできません。
以下、技術的な知見や対応案です。
ダウンロードの方法が今の方法でうまく言っているのは、恐らく『同じブラウザ内』で操作しているからです。
セッションという概念のもとに、同じアプリケーションからの一連のアクセスだと認識しているから実施可能となっています。
(まぁ、名前を付けて保存したようなローカルページからいじれるなんてのはセキュリティ的にはNGなシステムですが)
ローカルページを操作するタイミングで別なアプリケーション(VBA)から操作しようとすると、それは元のログインしたアプリケーションとは別セッション扱いになり、ログインしていないとみなされ、恐らく希望する動作を行うことができません。
(できるようだったらやってしまえばいいです!システムの穴を突く形になりますが)
そのため、VBAから制御するには【基本的には】以下の2パターンが考えられます。
【案1】
起動済みのブラウザの対象ページを捕捉し、DOM操作によってボタンを押させる。
以下を参考に。
https://www.vba-ie.net/ie/iefind.php#a9
https://vba-code.net/ie/
ただ、捕捉に関しては、ブラウザはタブという概念があります。
そのため、プロセス名『iexplorer.exe』、名前『Internet Explorer』というものは
複数存在する可能性がありますので、自力で走査しなければなりません。
または、求めているページが必ず表示されているとは限りません。
まずはIE自体を捕捉し、その後、ローカルページにナビゲーションさせて、DOM操作をする、という手順がいいかもしれません。
が、これも、VBAで制御中に、人間が、例えばIEを閉じたり、ページ遷移させたりすると正しく動作しませんので、それを理解した上での話になります。
この方法は、運用する手順の入口から出口までが一本化されていないので、複雑化する傾向が出ます。
【案2】
先に記したセッションの関係上、VBAでログインからダウンロードまですべてを行う。
VBAから新たにブラウザをバックグラウンドで起動させ、VBAで全部処理させる形です。
手抜きすることなく、VBAで全部頑張るということですね。
しかしこれも、VBAで制御中に、手動で、ブラウザのプロセスを終了させると正しく完了できませんので、それも理解した上での話になります。
何でもかんでも自動化を望み始めると、恐らくどれもハードルが高くなりますので、
やれるならやればいいですけど、どこかで妥協することも必要になるかもしれませんね。
No.8
- 回答日時:
No.7
- 回答日時:
> 「エクセル側で自動的に上記処理をさせるには」と申し上げております。
Excel側で操作することはヨシなわけですね。
であれば、
Sample.xlsx
Sample1.csv
Sample2.csv
Sample3.csv
というファイルをすべて同一ディレクトリ配下に設置するというルールを設け、
Sample.xlsxで、各CSVを取り込んでください。
データ → テキストファイル から取り込めます。
その後は、CSVファイルだけを差し替え、
データ → すべて更新
を押下すれば、勝手に同期します。
なお、
データ → すべて更新(▼部分をクリック) → 接続のプロパティ で
『更新時にファイル名を確認』というチェックを外せば、いちいちファイルの選択を求められません。
ありがとうございます。この方法で要望を満たせます。
VBAで「全て更新」の実行もできました。
あとはダウンロードまでVBAで行えるかなのですが、
DL.html を開いて、補足に記載している「すべてダウンロード」をクリックさせるのをVBAでできないでしょうか?
もちろん方法が変わっても構いません。
No.5
- 回答日時:
No4です
>試そうとしましたが、URLを貼るとログイン画面になってしまい
No4にも記しましたが、URL指定だけで取得できない場合は単純にはいかないですね。
サイトの仕組みにもよるので、成功している方法で行うのが宜しいかと。
もしも、DL後にVBAで読み込むのであれば、No3の方法で連続して処理するようにしてしまえば、方法はともかく、直接読み込んでいるような感じに見えるのではないでしょうか?
No.4
- 回答日時:
No3です
>DLしたCSVは1つのエクセルの各シートに取り込む作業があるのですが、
URL指定だけで読み取れるようなものでしたら、エクセルのWEBクエリを利用すれば、いちいちCSVファイル経由でなんてことを意識しなくても良くなりそうな気がしますが?
すみません。
言ってる意味が理解できませんでした。
実際にWEBクエリで試そうとしましたが、URLを貼るとログイン画面になってしまい、
ログインすると、ファイルを開くか保存するかというダイアログが出るので何をしたら良いか分かりませんでした。
No.3
- 回答日時:
こんにちは
通常のHTMLやスクリプトの仕組みではちょっと無理っぽいので、別の角度からの回答です。
要は、『手間を省きたい』という主旨のようですので、操作をそのまま自動化するという考え方でのアプローチです。
対象サイトの構造や処理の仕組みによってはうまくいかない場合もありますが、基本的な操作の自動化に関しては以下の辺りを組み合せれることで実現可能と思いますのでご参考までに。
なお、以下のサイトの内容は吟味していません。あくまで参考としての列挙です。
検索すれば数多くの説明サイトが見つかると思いますので他のサイトもご覧ください。
ヒットしたものの内容がVBAのものが多いですが、別にVBAにこだわる必要もなく、VBその他でもよろしいかと思います。
<ログイン>
https://tonari-it.com/vba-ie-login/
https://qiita.com/salmonosushi/items/9ce79759de6 …
<クリック>
http://www.fastclassinfo.com/entry/vba_ie_links_ …
https://vba-code.net/ie/click-a-button/
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Windowsのマクロプログラムで、こんなことできますか? 3 2022/06/28 14:30
- Chrome(クローム) 入力フォームの履歴を消したい 2 2023/06/29 13:02
- HTML・CSS HTMLタグのあるCSVファイルを利用する方法 4 2023/03/19 14:41
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- HTML・CSS VSコードでHTMLに(リンク)ファイル名をクリックしてもファイルが開かれない 1 2023/02/12 07:52
- その他(クラウドサービス・オンラインストレージ) firestorage_androidスマホでダウンロードできない 1 2022/10/25 08:18
- Windows 10 e-Gov 電子申請について 回答お願いします。 社会保険保険証加入手続きを電子申請しました。 返戻 3 2022/10/02 09:05
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- MySQL MySQL,JavaScript,PHPコードの結果を表示する方法を教えてください。 1 2023/02/13 17:49
- Java 動かなくなったのでJavaソースを手直しお願いします。 2 2022/04/30 05:35
このQ&Aを見た人はこんなQ&Aも見ています
-
EXCELファイルの複数ダウンロードについて
Microsoft ASP
-
選択した複数のファイルを、一括ダウンロードしたい。
HTML・CSS
-
PHPで複数ファイルのダウンロード
PHP
-
-
4
複数ファイルを連続でダウンロード
PHP
-
5
一つのリンクに複数のURLを指定
HTML・CSS
-
6
ホームページ上の複数のPDFファイルを一括ダウンロードできるフリーソフ
フリーソフト
-
7
ASPでCSVファイルを作成しダウンロードさせる
Microsoft ASP
-
8
visitedで訪問したリンクの色をリセットしたい
その他(IT・Webサービス)
-
9
javascriptでファイルダウンロードをさせようとしたとき2回目以降ダウンロード失敗する。
JavaScript
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
java_run.batがダウンロードで...
-
Webサイトから、txtファイルを...
-
Flashムービーに埋め込まれたリ...
-
XMLファイルのダウンロード
-
アクセスした瞬間にダウンロード
-
CGIファイルの開き方
-
【HTML】1クリックで複数ファイ...
-
SWFファイルのダウンロードにつ...
-
WEB上でPDF閲覧のみにしたいです。
-
ホームページからダウンロード
-
自分のHPからダウンロードして...
-
VS2005ExpressEdition無償版ダ...
-
ファイルを載せるには?
-
VBA URLDownloadToFileについて
-
HTMLページが勝手にダウンロー...
-
HPで音楽ファイルをDLできる...
-
VC++でHTTPプロトコルを用いた...
-
HTTP上にあるファイルの更新日時
-
ホームページビルダーV9でエ...
-
URLDownloadToFile でダウンロ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【HTML】1クリックで複数ファイ...
-
Webサイトから、txtファイルを...
-
HTMLページが勝手にダウンロー...
-
java_run.batがダウンロードで...
-
VBA URLDownloadToFileについて
-
URLDownloadToFile でダウンロ...
-
WEB上でPDF閲覧のみにしたいです。
-
Excelのマクロについて教えてく...
-
XMLファイルのダウンロード
-
ZIPの拡張子のついたURLがダウ...
-
ファイルをダウンロードすると...
-
エクセルのファイルのダウンロ...
-
フォームのボタンをダウンロー...
-
javascriptでファイルダウンロ...
-
IE操作時、ファイルのダウンロ...
-
VBA IE操作でダイアログ表示後...
-
選択した複数のファイルを、一...
-
VBAでIEのファイルを自動的にダ...
-
ダウンロード完了後メッセージ...
-
asp ダウンロード中にタイムア...
おすすめ情報
本件に関しては自己解決しました。
参考までに方法を載せておきます。
<a href="#" onClick="window.open('URL1');window.open('URL2');window.open('URL3');return false;">すべてダウンロード</a>
上記の「URL」のところに指定しておけば、1回リンクをクリックするだけでいくつでもDLできました。
恐らく最初ポップアップブロックされると思うので解除すれば次回からOKです。
DLしたCSVは1つのエクセルの各シートに取り込む作業があるのですが、
エクセル側で自動的に上記処理をさせるにはどうしたら良いかアドバイスいただけると助かります。