LoginSignup
4
6

More than 1 year has passed since last update.

WSHでExcel内テキスト置換ツールを作るよ

Last updated at Posted at 2018-01-30

WSHでExcel内テキスト置換ツールを作るよ

以下に対応してるよ

  • セル内テキスト置換
  • オートシェイプ内テキスト置換
  • 正規表現
  • Drag & Dropで、複数ファイル一気に置換

本体

XlsxReplace.wsf
// UTF-8(BOM付)で保存すること.
<job>
  <script language="JavaScript" src="CommonUtil.js"></script>
  <script language="JavaScript" src="XlsxUtil.js"></script>
  <script language="JavaScript" src="IeUtil.js"></script>
  <resource id="inputHtml">
    <![CDATA[
      <html>
      <head>
        <meta charset="utf-8"/>
        <style type="text/css">
        <!--
        body { font-family:'メイリオ',Meiryo; }
        ul { padding-left: 0px; list-style-type: none; }
        li[id="wrapper"] { text-align:center; }
        input[type="button"] {
          font-size: 1.4em; font-weight: bold; padding: 10px 30px;
          -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px;
         }
        -->
        </style>
      </head>
      <body>
        <form>
          <input type="hidden" id="CLICKED" value="false"/>
          <ul>
            <li>置換条件入力(正規表現対応)</li>
            <li>対象文字列: <input type="text" id="targetStr"/></li>
            <li>置換文字列: <input type="text" id="replaceStr"/></li>
            <br/>
            <li><input type="checkbox" id="allReplace" checked />該当文字列は全置換する</li>
            <li><input type="checkbox" id="autoShapes" />オートシェイプ内も置換する</li>
            <br/>
            <li id="wrapper">
              <input type="button" onClick="quit()" value="実行"/>
            </li>
          </ul>
        </form>
        <script>
          document.body.style.overflow = "hidden";
          function quit(){
            document.getElementById( "CLICKED" ).value="true";
            window.open('','_self').close();
          }
        </script>
      </body>
      </html>
    ]]>
  </resource>
  <script language="JavaScript">
    // 引数チェック.
    if ( WScript.Arguments.length === 0 ){
      $.info( "ファイルをD&Dしてください.", "エラー" );
      WScript.Quit();
    }

    var displaySize = $.IE.getDisplaySize();
    var replaceInfo = $.IE.displayCustomWindow(
      displaySize.width, displaySize.height, 360, 300, getResource( "inputHtml" ), "置換条件入力"
    );

    // 実行.
    var NewBookPrefix = "new_";
    var reg = new RegExp( replaceInfo.targetStr, replaceInfo.allReplace ? 'g' : '' );
    $.mapX( WScript.Arguments, function( arg ){
      $.Xlsx.withXlsx( arg, function( ole, book ){
        $.mapX( book.Worksheets, function( sheet ){
          if ( replaceInfo.autoShapes ){
            $.Xlsx.replaceShapeValue( sheet, reg, replaceInfo.replaceStr );
          }
          $.Xlsx.replaceCellValue( sheet.usedrange, reg, replaceInfo.replaceStr );
        });

        // saveAs.
        book.Saveas( book.Path + $.FileSeparator + NewBookPrefix + book.Name );
      });
    });

    // 終了.
    $.info( "done.", "end" );
    WScript.Quit();
  </script>
</job>



共通FW

https://qiita.com/onegear0o/items/1dc4a30cf9ec4dd120e0
から、大半流用させてもらってます.

CommonUtil.js
//  CommonUtil.js
//  UTF-8(BOM付)で保存すること.
(function() {
  "use strict";

  var root = this;

  var $ = function( obj ) {
    if ( obj instanceof $ ) return obj;
    if ( !( this instanceof $ ) ) return new $( obj );
    this._wrapped = obj;
  }

  root.$ = $;

  $.Fso = new ActiveXObject( "Scripting.FileSystemObject" );
  $.Shell = new ActiveXObject( "WScript.Shell" );

  $.FileSeparator = "/";
  $.AdoDbStream = {
    obj : new ActiveXObject( "ADODB.Stream" ),

    // StreamTypeEnum.
    adTypeBinary : 1,
    adTypeText : 2,

    // SaveOptionsEnum.
    adSaveCreateNotExist : 1,
    adSaveCreateOverWrite : 2,

    // StreamWriteEnum.
    adWriteChar : 0,
    adWriteLine : 1,

    // StreamReadEnum.
    adReadAll : -1,
    adReadLine : -2,

    LF : 10,

    // read file with charset.
    readFile : function( fullPath, charset, func ) {
      if ( charset == null ) {
        charset = "_autodetect_all";
      }
      var st = $.AdoDbStream.obj;
      st.Type = $.AdoDbStream.adTypeText;
      st.charset = charset;
      st.LineSeparator = $.AdoDbStream.LF;
      st.Open();
      st.LoadFromFile( fullPath );
      st.Position = 0;
      while( ! st.EOS ){
        func( st.ReadText( $.AdoDbStream.adReadLine ) );
      }
      st.Close();
    },

    // write file with charset.
    writeFile : function( fullPath, text, charset ) {
      if ( charset == null ) {
        charset = "_autodetect_all";
      }
      var st = $.AdoDbStream.obj;
      st.Type = $.AdoDbStream.adTypeText;
      st.charset = charset;
      st.Open();
      st.WriteText( text, $.AdoDbStream.adWriteLine );
      st.SaveToFile( fullPath, $.AdoDbStream.adSaveCreateOverWrite );
      st.Close();
    }
  }

  $.yesno = function( message, title ) {
    return $.Shell.Popup( message, 0, title, 1 );
  }

  $.info = function( message, title ) {
    return $.Shell.Popup( message, 0, title, 0 );
  }

  $.log = function( m ) {
    WScript.echo( m );
  }

  // each with activeXObject
  $.eachX = function( obj, func ) {
    for( var _obj = new Enumerator( obj ); !_obj.atEnd(); _obj.moveNext() ){
      var v = _obj.item();
      func( v )
    }
  }

  // map with activeXobject
  $.mapX = function( obj, func ) {
    var ret = [];
    for( var _obj = new Enumerator( obj ); !_obj.atEnd(); _obj.moveNext() ){
      var v = _obj.item();
      var value = func( v );
      if ( !( value === false ) ) ret[ret.length] = value
    }
    return ret;
  }

  $.assignObject = function( obj1, obj2 ) {
    if ( !obj2 ) {
      obj2 = {};
    }
    for ( var attrName in obj2 ) {
      if ( obj2.hasOwnProperty( attrName ) ) {
        obj1[attrName] = obj2[attrName];
      }
    }
    return obj1;
  }

  $.objectkeys = function( obj ) {
    var keys = [];
    for ( var attrName in obj ) {
      if ( obj.hasOwnProperty( attrName ) ) {
        keys.push( attrName );
      }
    }
    return keys;
  }

  $.getZeroPadding = function( number, digits ) {
    return ( Array( digits +1 ).join( '0' ) + number ).slice( -digits );
  }

  $.getDateString = function( date, dateFormat ) {
    var months = [
      "Jan", "Feb", "Mar", "Apr", "May", "Jun",
      "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
    ];
    var dayOfWeekStr = [ "", "", "", "", "", "", "" ];
    var dayOfWeekEngStr = [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ];
    return dateFormat
      .replace( /@YYYY@/g, date.getFullYear() )
      .replace( /@YY@/g, ( "" + date.getFullYear() ).slice( -2 ) )
      .replace( /@MMM@/g, months[ date.getMonth() ] )
      .replace( /@MM@/g, $.getZeroPadding( date.getMonth() + 1, 2) )
      .replace( /@M@/g, date.getMonth() + 1 )
      .replace( /@DD@/g, $.getZeroPadding( date.getDate(), 2) )
      .replace( /@D@/g, date.getDate() )
      .replace( /@hh@/g, $.getZeroPadding( date.getHours(), 2) )
      .replace( /@h@/g, date.getHours() )
      .replace( /@mm@/g, $.getZeroPadding( date.getMinutes(), 2) )
      .replace( /@m@/g, date.getMinutes() )
      .replace( /@ss@/g, $.getZeroPadding( date.getSeconds(), 2) )
      .replace( /@s@/g, date.getSeconds() )
      .replace( /@EEE@/g, dayOfWeekStr[ date.getDay() ] )
      .replace( /@eee@/g, dayOfWeekEngStr[ date.getDay() ] );
  }

  $.isDate = function( s ){
    var d = new Date( s );
    return d.toString() !== 'NaN' && d.toString() !== 'Invalid Date';
  }

  $.compareDateStr = function( dateStr1, dateStr2 ){
    var date1 = new Date( dateStr1 );
    var date2 = new Date( dateStr2 );
    return date1.getTime() < date2.getTime() ? -1 : date1.getTime() > date2.getTime() ? 1 : 0;
  }

  Array.prototype.indexOf = function(obj, start){ for(var i = (start || 0), j = this.length; i < j; i++){ if(this[i] === obj){ return i }} return -1 };

}).call( this );



Excel用FWっぽいの

https://qiita.com/onegear0o/items/1dc4a30cf9ec4dd120e0
から、大半流用させてもらってます.

XlsxUtil.js
//    XlsxUtil.js
// UTF-8(BOM付)で保存すること.
(function () {
  "use strict";

  var root = this;

  if ( typeof $ === "undefined" ) {
    WScript.echo('"CommonUtil.js" must be loaded.');
    WScript.Quit();
  }

  // For Excel.
  $.Xlsx = {
    // XlPageOrientation.
    xlPortrait: 1,
    xlLandscape: 2,

    // XlWindowView.
    xlNormalView: 1,
    xlPageBreakPreview: 2,
    xlPageLayoutView: 3,

    // XlPaperSize.
    xlPaperA3: 8,
    xlPaperA4: 9,
    xlPaperA5: 11,
    xlPaperB4: 12,
    xlPaperB5: 13,

    withXlsx : function ( file_name , func ) {
      var ole = new ActiveXObject( "Excel.Application" );
      ole.Visible = false;
      ole.DisplayAlerts = false;
      var book = null;
      var full_path = null;
      try {
        full_path = $.Fso.getAbsolutePathName( file_name );
        book = ole.Workbooks.Open( full_path );
        func( ole , book );
      } catch( e ) {
        $.log( e.name + ":" + e.message );
      } finally {
        if( book != null){
          book.Close();
        }
        ole.Quit();
      }
    },

    range2hash : function ( range ) {
      var ret = [];
      ret = $.mapX( range.rows , function( row ) {
        var _v = $.mapX( row.columns , function( cell ) {
          var v = cell.value;
          if ( typeof v == "undefined" ) v = "";
          if ( typeof v == "unknown" ) v = "#REF"
            return v;
        })
        return _v;
      })
      return ret;
    },

    range2AddressMap : function ( sheetName ,range ) {
      var ret = {};
      $.mapX( range.rows , function( row ) {
        $.mapX( row.columns , function( cell ) {
          var text = cell.Text;
          if ( text ) ret[sheetName + "!" + cell.Address( false, false )] = text;
        });
      });
      return ret;
    },

    replaceCellValue : function ( range, reg, replaceStr ) {
      $.mapX( range.rows , function( row ) {
        $.mapX( row.columns , function( cell ) {
          var text = cell.Text;
          if ( text ) cell.Value = text.replace( reg, replaceStr );
        });
      });
    },

    replaceShapeValue : function ( sheet, reg, replaceStr ) {
      $.mapX( sheet.Shapes , function( shape ) {
        var text = null;
        try {
          if ( shape.TextFrame2.HasText ){
            text = shape.TextFrame.Characters().Text;
          }
        } catch ( e ) {
          return;
        }
        if ( text ){
          shape.TextFrame.Characters().Text = text.replace( reg, replaceStr );
        }
      });
    }

  }
}).call( this );



IE制御用FWっぽいの

IeUtil.js
//    IeUtil.js
// UTF-8(BOM付)で保存すること.
(function () {
  "use strict";

  var root = this;

  if ( typeof $ === "undefined" ) {
    WScript.echo('"CommonUtil.js" must be loaded.');
    WScript.Quit();
  }

  // for catch OnQuit event.
  root.IE_OnQuit = function (){
    $.IE.onQuitWrapper();
  }

  // For IE.
  $.IE = {

    // ReadyState.
    READYSTATE_UNINITIALIZED : 0,
    READYSTATE_LOADING : 1,
    READYSTATE_LOADED : 2,
    READYSTATE_INTERACTIVE : 3,
    READYSTATE_COMPLETE : 4,

    ObjectIE : WScript.CreateObject( "InternetExplorer.Application", "IE_" ),
    SettingInfo : {},
    Clicked : false,

    // IEを閉じた際のエベント処理
    onQuitWrapper : function (){
      var objIe = this.ObjectIE;
      if ( objIe.document.getElementById( "CLICKED" ).value === "true" ){
        // inputタグの処理
        $.mapX( objIe.document.getElementsByTagName( "input" ), function( tag ){
          $.IE.setTagVal( tag, $.IE.SettingInfo );
        });

        // selectタグの処理
        $.mapX( objIe.document.getElementsByTagName( "select" ), function( tag ){
          $.IE.setTagVal( tag, $.IE.SettingInfo );
        });
      }
      this.Clicked = true;
    },

    // IEオブジェクトより、ディスプレイサイズ(Widht, Height)を取得する.
    getDisplaySize : function ( path ){
      var objIe = WScript.CreateObject( "InternetExplorer.Application" );
      this.Clicked = false;
      this.SettingInfo = {};
      objIe.Visible = false;
      objIe.Navigate( "about:blank" );
      this.waitIE( objIe );
      var width = objIe.document.parentWindow.screen.width;
      var height = objIe.document.parentWindow.screen.height;
      objIe.Quit();
      return { "width": width, "height": height };
    },

    // IEのオブジェクトを作り、画面の設定をして、表示.
    // HtmlのInputタグ入力値を返却
    displayCustomWindow : function (
      displayWidth,
      displayHeight,
      windowWidth,
      windowHeight,
      html,
      title
    ){
      var objIe = this.ObjectIE;
      this.Clicked = false;
      this.SettingInfo = {};
      objIe.Left = ( displayWidth - windowWidth ) / 2;
      objIe.Top = ( displayHeight - windowHeight ) / 2;
      objIe.Width = windowWidth;
      objIe.Height = windowHeight;
      objIe.ToolBar = false;
      objIe.StatusBar = false;
      objIe.Resizable = true;
      objIe.Visible = true;
      objIe.Navigate( "about:blank" );
      this.waitIE( objIe );

      objIe.document.write( html );
      objIe.document.title = title;

      // ボタンクリック待ち.
      while ( ! this.Clicked ) { WScript.Sleep(500) }

      // 判定.
      if ( ! $.objectkeys( $.IE.SettingInfo ).length ){
        WScript.quit();
      }

      return $.IE.SettingInfo;
    },

    // IEがビジー状態の間待ちます.
    waitIE : function ( objIe ){
      while( ( objIe.Busy ) || ( objIe.readystate != this.READYSTATE_COMPLETE ) ){
        WScript.Sleep( 100 );
      }
    },

    // set Tag-Value.
    setTagVal : function ( tag, ret ){
      switch ( tag.type.toLowerCase() ){
        case "text":
          ret[ tag.id ] = tag.value;
          break;
        case "checkbox":
          ret[ tag.id ] = tag.checked;
          break;
        case "radio":
          ret[ tag.name ] = tag.checked ? tag.value : ret[ tag.name ];
          break;
        case "select-one":
          ret[ tag.id ] = tag.value;
          break;
        default:
          // Do Nothing.
          break;
      }
      return ret;
    }
  }
}).call( this );



統合版

面倒な人はこれをローカルにコピペして使ってください。

XlsxReplace.wsf
// UTF-8(BOM付)で保存すること.
<job>
  <script language="JavaScript">
    (function(){"use strict";var e=function(t){return t instanceof e?t:this instanceof e?void(this._wrapped=t):new e(t)};this.$=e,e.Fso=new ActiveXObject("Scripting.FileSystemObject"),e.Shell=new ActiveXObject("WScript.Shell"),e.FileSeparator="/",e.AdoDbStream={obj:new ActiveXObject("ADODB.Stream"),adTypeBinary:1,adTypeText:2,adSaveCreateNotExist:1,adSaveCreateOverWrite:2,adWriteChar:0,adWriteLine:1,adReadAll:-1,adReadLine:-2,LF:10,readFile:function(t,a,n){null==a&&(a="_autodetect_all");var r=e.AdoDbStream.obj;for(r.Type=e.AdoDbStream.adTypeText,r.charset=a,r.LineSeparator=e.AdoDbStream.LF,r.Open(),r.LoadFromFile(t),r.Position=0;!r.EOS;)n(r.ReadText(e.AdoDbStream.adReadLine));r.Close()},writeFile:function(t,a,n){null==n&&(n="_autodetect_all");var r=e.AdoDbStream.obj;r.Type=e.AdoDbStream.adTypeText,r.charset=n,r.Open(),r.WriteText(a,e.AdoDbStream.adWriteLine),r.SaveToFile(t,e.AdoDbStream.adSaveCreateOverWrite),r.Close()}},e.yesno=function(t,a){return e.Shell.Popup(t,0,a,1)},e.info=function(t,a){return e.Shell.Popup(t,0,a,0)},e.log=function(e){WScript.echo(e)},e.eachX=function(e,t){for(var a=new Enumerator(e);!a.atEnd();a.moveNext()){t(a.item())}},e.mapX=function(e,t){for(var a=[],n=new Enumerator(e);!n.atEnd();n.moveNext()){var r=t(n.item());!1!==r&&(a[a.length]=r)}return a},e.assignObject=function(e,t){for(var a in t||(t={}),t)t.hasOwnProperty(a)&&(e[a]=t[a]);return e},e.objectkeys=function(e){var t=[];for(var a in e)e.hasOwnProperty(a)&&t.push(a);return t},e.getZeroPadding=function(e,t){return(Array(t+1).join("0")+e).slice(-t)},e.getDateString=function(t,a){return a.replace(/@YYYY@/g,t.getFullYear()).replace(/@YY@/g,(""+t.getFullYear()).slice(-2)).replace(/@MMM@/g,["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"][t.getMonth()]).replace(/@MM@/g,e.getZeroPadding(t.getMonth()+1,2)).replace(/@M@/g,t.getMonth()+1).replace(/@DD@/g,e.getZeroPadding(t.getDate(),2)).replace(/@D@/g,t.getDate()).replace(/@hh@/g,e.getZeroPadding(t.getHours(),2)).replace(/@h@/g,t.getHours()).replace(/@mm@/g,e.getZeroPadding(t.getMinutes(),2)).replace(/@m@/g,t.getMinutes()).replace(/@ss@/g,e.getZeroPadding(t.getSeconds(),2)).replace(/@s@/g,t.getSeconds()).replace(/@EEE@/g,["","","","","","",""][t.getDay()]).replace(/@eee@/g,["Sun","Mon","Tue","Wed","Thu","Fri","Sat"][t.getDay()])},e.isDate=function(e){var t=new Date(e);return"NaN"!==t.toString()&&"Invalid Date"!==t.toString()},e.compareDateStr=function(e,t){var a=new Date(e),n=new Date(t);return a.getTime()<n.getTime()?-1:a.getTime()>n.getTime()?1:0},e.Xlsx={xlPortrait:1,xlLandscape:2,xlNormalView:1,xlPageBreakPreview:2,xlPageLayoutView:3,xlPaperA3:8,xlPaperA4:9,xlPaperA5:11,xlPaperB4:12,xlPaperB5:13,withXlsx:function(t,a){var n=new ActiveXObject("Excel.Application");n.Visible=!1,n.DisplayAlerts=!1;var r=null,i=null;try{i=e.Fso.getAbsolutePathName(t),a(n,r=n.Workbooks.Open(i))}catch(t){e.log(t.name+":"+t.message)}finally{null!=r&&r.Close(),n.Quit()}},range2hash:function(t){return e.mapX(t.rows,function(t){return e.mapX(t.columns,function(e){var t=e.value;return void 0===t&&(t=""),"unknown"==typeof t&&(t="#REF"),t})})},range2AddressMap:function(t,a){var n={};return e.mapX(a.rows,function(a){e.mapX(a.columns,function(e){var a=e.Text;a&&(n[t+"!"+e.Address(!1,!1)]=a)})}),n},replaceCellValue:function(t,a,n){e.mapX(t.rows,function(t){e.mapX(t.columns,function(e){var t=e.Text;t&&(e.Value=t.replace(a,n))})})},replaceShapeValue:function(t,a,n){e.mapX(t.Shapes,function(e){var t=null;try{e.TextFrame2.HasText&&(t=e.TextFrame.Characters().Text)}catch(e){return}t&&(e.TextFrame.Characters().Text=t.replace(a,n))})}},this.IE_OnQuit=function(){e.IE.onQuitWrapper()},e.IE={READYSTATE_UNINITIALIZED:0,READYSTATE_LOADING:1,READYSTATE_LOADED:2,READYSTATE_INTERACTIVE:3,READYSTATE_COMPLETE:4,ObjectIE:WScript.CreateObject("InternetExplorer.Application","IE_"),SettingInfo:{},Clicked:!1,onQuitWrapper:function(){var t=this.ObjectIE;"true"===t.document.getElementById("CLICKED").value&&(e.mapX(t.document.getElementsByTagName("input"),function(t){e.IE.setTagVal(t,e.IE.SettingInfo)}),e.mapX(t.document.getElementsByTagName("select"),function(t){e.IE.setTagVal(t,e.IE.SettingInfo)})),this.Clicked=!0},getDisplaySize:function(e){var t=WScript.CreateObject("InternetExplorer.Application");this.Clicked=!1,this.SettingInfo={},t.Visible=!1,t.Navigate("about:blank"),this.waitIE(t);var a=t.document.parentWindow.screen.width,n=t.document.parentWindow.screen.height;return t.Quit(),{width:a,height:n}},displayCustomWindow:function(t,a,n,r,i,o){var c=this.ObjectIE;for(this.Clicked=!1,this.SettingInfo={},c.Left=(t-n)/2,c.Top=(a-r)/2,c.Width=n,c.Height=r,c.ToolBar=!1,c.StatusBar=!1,c.Resizable=!0,c.Visible=!0,c.Navigate("about:blank"),this.waitIE(c),c.document.write(i),c.document.title=o;!this.Clicked;)WScript.Sleep(500);return e.objectkeys(e.IE.SettingInfo).length||WScript.quit(),e.IE.SettingInfo},waitIE:function(e){for(;e.Busy||e.readystate!=this.READYSTATE_COMPLETE;)WScript.Sleep(100)},setTagVal:function(e,t){switch(e.type.toLowerCase()){case"text":t[e.id]=e.value;break;case"checkbox":t[e.id]=e.checked;break;case"radio":t[e.name]=e.checked?e.value:t[e.name];break;case"select-one":t[e.id]=e.value}return t}}}).call(this);
  </script>
  <resource id="inputHtml">
    <![CDATA[<html><head><meta charset="utf-8"/><style type="text/css">body{font-family:'メイリオ',Meiryo}ul{padding-left:0px;list-style-type:none}li[id="wrapper"]{text-align:center}input[type="button"]{font-size:1.4em;font-weight:bold;padding:10px 30px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}</style></head><body><form> <input type="hidden" id="CLICKED" value="false"/><ul><li>置換条件入力正規表現対応</li><br/><li><label for="targetStr">対象文字列: </label><input type="text" id="targetStr"/></li><li><label for="replaceStr">置換文字列: </label><input type="text" id="replaceStr"/></li> <br/><li><input type="checkbox" id="allReplace" checked /><label for="allReplace">該当文字列は全置換する</label></li><li><input type="checkbox" id="autoShapes" /><label for="autoShapes">オートシェイプ内も置換する</label></li><br/><li id="wrapper"><input type="button" onClick="quit()" value="実行"/></li></ul></form> <script>document.body.style.overflow="hidden";function quit(){document.getElementById("CLICKED").value="true";window.open('','_self').close();}</script> </body></html>]]>
  </resource>
  <script language="JavaScript">
    // 引数チェック.
    if ( WScript.Arguments.length === 0 ){
      $.info( "ファイルをD&Dしてください.", "エラー" );
      WScript.Quit();
    }

    // const.
    var XlsxPrefix = "$.Xlsx.";
    var OutputPrefix = "REP";

    var displaySize = $.IE.getDisplaySize();
    var replaceInfo = $.IE.displayCustomWindow(
      displaySize.width, displaySize.height, 400, 380, getResource( "inputHtml" ), "置換条件入力"
    );

    // create folder.
    var dir = $.Fso.GetFile( WScript.Arguments.Item(0) ).ParentFolder + $.FileSeparator +
      OutputPrefix + $.getDateString( new Date(), '@YYYY@@MM@@DD@@hh@@mm@@ss@' );
    if ( !$.Fso.FolderExists( dir ) ){
      $.Fso.CreateFolder( dir );
    }

    // 実行.
    var reg = new RegExp( replaceInfo.targetStr, replaceInfo.allReplace ? 'g' : '' );
    $.mapX( WScript.Arguments, function( arg ){
      $.Xlsx.withXlsx( arg, function( ole, book ){
        $.mapX( book.Worksheets, function( sheet ){
          if ( replaceInfo.autoShapes ){
            $.Xlsx.replaceShapeValue( sheet, reg, replaceInfo.replaceStr );
          }
          $.Xlsx.replaceCellValue( sheet.usedrange, reg, replaceInfo.replaceStr );
        });

        // saveAs.
        book.Saveas( dir + $.FileSeparator + book.Name );
      });
    });

    // 終了.
    $.info( "done.", "end" );
    WScript.Quit();
  </script>
</job>

総括・ハマりポイント

  • 入力用HTMLに懲りすぎてしまった。
  • とにかくデバッグがやりづらかった。
  • HTMLの中の<\/script>でエスケープが必要なことに気づけず少しはまった。
  • WSHファイルだと色々外部化してImportすればいいので、構造が見やすくなる印象。
  • 次は、Excelの簡易差分表示できるのが欲しい
  • 最高に綺麗なソースにしたいけど、これが限界。
  • IE側処理終了時(ボタンや×ボタン押下時)にIEオブジェクトの解放がうまくいかず、
    処理自体は正常終了するもののエラーになる場合がある。
    ⇒Enumerator にIEオブジェクトを入れるとその後Quit時にエラーとなる。参照が切れてない?
    
    仮調査結果:
    ○ getElementById, getElementsByTagName
    × querySelectorAll
    
4
6
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6