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

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

ただいまの
回答率

88.93%

【JavaScript】PWがかかっているファイルは対象とせずスキップさせたい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,877

maro_maro

score 7

初歩的な質問で大変恐縮です。
VBAのド初心者でJavaScriptは全く未知の世界です。

業務で必要となり、検索で見つけたものです。
改変・再配布自由なプログラムです。
アレンジをご教示いただけますでしょうか。

【希望内容】
Excelファイルにパスワードをかけるプログラムのアレンジです。
PWがすでにかかっているファイルが混在していても、
当該ファイルはスキップし、かかっていないファイルにのみPWをかける。

PWを一気に、しかも処理時間も早く非常に便利なのですが、
業務で整理対象となるファイルにPWがかかっているものとないものが混在し困っています。

エラーとなった時点で、ファイルの更新時間で判断すればよいのですが、
混在していてもスキップして作業が終わってもらえると、
作業残がないかどうか確認作業が不要となり助かります。

お力添えいただけますでしょうか。
どうぞよろしくお願いいたします。


◆仕事に役立つJava Script入門/クジラ飛行机
http://pc.nikkeibp.co.jp/article/column/20101201/1028886/?P=2&rt=nocnt

★ReadMe.txtより
-----------------------------------------------------------
* excelPassword -- Excelファイルにパスワードをかける
-----------------------------------------------------------
[概要]
Excelファイルをドラッグ&ドロップ一発で全てのファイルに
パスワードを設定することができます。

[ライセンス]
MIT License -- 自由に改変・再配布しても構いません。

[制作者]
クジラ飛行机 (http://kujirahand.com)
-----------------------------------------------------------

★プログラム内容

//---------------------------------------------------------
// ドラッグ&ドロップされたExcelファイルにパスワードをかける
//---------------------------------------------------------
// ドラッグ&ドロップされたファイルを確認する
var file_count = WScript.Arguments.Count();
if (file_count == 0) {
  WScript.echo("ファイルがありません。");
  WScript.Quit();
}
// Excelを起動する
var excel = WScript.CreateObject("Excel.Application");
excel.Visible = true; // 画面に表示する
excel.DisplayAlerts = false; // 警告が出ないようにする
// パスワードを入力する
var password = excel.InputBox("パスワードを入力してください");
// ドラッグ&ドロップされたファイルを1つずつ処理する
for (var i = 0; i < file_count; i++) {
  setPassword(WScript.Arguments.Item(i));
}
excel.Quit();
WScript.echo("終わりました!");
//---------------------------------------------------------
// Excelファイルにパスワードを設定する関数
function setPassword(fname) {
  var book = excel.Workbooks.Open(fname); // ブックを開く
  book.Password = password; // パスワードを設定
  book.SaveAs(fname); // ブックを保存
  book.Close(); // ブックを閉じる
}
//---------------------------------------------------------
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

0

JavaScriptではエラーが発生した場合の処理を記述出来ます。
それを逆手にとり、エラーが発生した場合、後続の処理を行わず、
処理をスキップすることも可能になります。

setPassword関数を以下のように変更してください。
function setPassword(fname) { 
  try{
  var book = excel.Workbooks.Open(fname,null,false,null,"",""); // パスワードに空を指定してブックを開く 
  book.Password = password; // パスワードを設定 
  book.SaveAs(fname); // ブックを保存 
  book.Close(); // ブックを閉じる 
  }catch(e){
    // エラー発生の場合、パスワードが掛っていると判断し処理をスキップ
  }
} 


投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/11/14 21:32

    お礼が遅くなり申し訳ありません。
    ありがとうございます!
    希望通りの挙動で、確認作業の手間がなくなり大変助かります。
    マクロより作業時間が全然早くてJavaScriptすごいな~って思ってる
    初心者には大変ありがたいご回答でした。
    今後もご教示いただけたら幸いです。

    キャンセル

  • 2015/11/16 09:15

    遅くなりましたが蛇足です。
    適当に読み流してください。

    今回使用しているコードは、JavaScriptではなく、実は"JScript"です。
    JavaScriptとJScriptはコードの書き方等基本的には同じものですが、
    JScriptはWindows上でしか使用できません。(最近は他OSでも使えるようになってきているようですが。)
    他OSを使用する場合はご注意ください。

    あと、これはこのサイトの使い方についてですが、
    エクセルを操作する等エクセルに関係のあるものは、
    タグにExcelをつけた方がよいです。
    Excelは特殊なので、JavaScriptを知っていてもエクセルの操作を知らない人は多いです。

    キャンセル

0

http://oshiete.goo.ne.jp/qa/4373463.html
おしえて goo あたりで、上記 url にパスワードが掛かっているエクセルを判定するvbscript が載ってるので、組み合わせて一つにして欲しいって質問したらどうですか。

パスワード指定で、ブランクを指定してオープン、開ければパスワード設定無し、開けないでエラーならパスワード有りというロジックです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/11/14 21:37

    お礼が遅くなり申し訳ありません。
    質問方法のご教示ありがとうございました。

    キャンセル

0

setPassword関数内で、
book.HasPassword(戻り値は、true or false)をチェックして、falseの場合だけpasswordを設定すれば良いのではないかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/11/14 21:35

    お礼が遅くなり申し訳ありません。
    ご教示ありがとうございました。
    業務で使いたいVBAでの参考になりました。
    恐縮ですがJavaScriptの記述をご回答いただけた方をベストアンサーにさせていただきました。

    キャンセル

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

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る