2016-06-17 3 views
1

ワークブックを考えると、ワークシートを使い、使用範囲を取得したいと考えています。私は次のコードを書いています:ブックの使用範囲をすべて取得する方法

function getUsedRanges() { 
    Excel.run(function (ctx) { 
     var worksheets = ctx.workbook.worksheets; 
     var sheetnames = []; 
     worksheets.load('items'); 
     return ctx.sync().then(function() { 
      for (var i = 0; i < worksheets.items.length; i++) { 
       worksheets.items[i].load('name'); 
      }; 
      return ctx.sync().then(function() { 
       for (var i = 0; i < worksheets.items.length; i++) { 
        sheetnames.push(worksheets.items[i].name); 
       }  
      }) 
     }).then(function() { 
      var usedRange = []; 
      for (var i = 0; i < worksheets.items.length; i++) { 
       var worksheet = ctx.workbook.worksheets.getItem(sheetnames[i]); 
       usedRange[i] = worksheet.getUsedRange(); 
       usedRange[i].load('address'); 
      }; 
      return ctx.sync().then(function() { 
       for (var i = 0; i < worksheets.items.length; i++) { 
       console.log(usedRange[i].address); 
       } 
      }); 
     }) 
    }) 
}  

しかし、コードは私に重いです。例えば、

1)私はsheetnamesを取得するためにnameをロードし、その後itemsをロードしなければならなかった)getItem

2により各ワークシートへのアクセス権を持っているsheetnamesを記録しなければなりませんでした。

コードを軽くする方法やプロパティがあるかどうか知りませんか?このようなタスクのコードの構造は何ですか?

編集1:マイケルの答えの後、私はまだusedRangessheet namesの両方を取得したバージョンを入れ、sheet namesusedRangesを得るために必須ではありませんのでご注意:

function getUsedRanges() { 
    Excel.run(function (ctx) { 
     var worksheets = ctx.workbook.worksheets; 
     var usedRange = []; 
     worksheets.load('name'); 
     return ctx.sync() 
      .then(function() { 
       for (var i = 0; i < worksheets.items.length; i++) { 
        usedRange[i] = worksheets.items[i].getUsedRange(); 
        usedRange[i].load('address'); 
       }; 
      }) 
      .then(ctx.sync) 
      .then(function() { 
       for (var i = 0; i < worksheets.items.length; i++) { 
        console.log(worksheets.items[i].name); 
        console.log(usedRange[i].address); 
       } 
      }) 
     }) 
} 

答えて

1

いくつかのこと:

1)worksheets.load('items');は何もしません。コレクションの読み込みでは、気になる子アイテムのプロパティ名を指定する必要があります。ワークシートの名前を知りたい場合は、あなたがworksheet.load('name')を行う必要があり、そしてあなたがctx.workbook.worksheets.getItem(sheetnames[i]);を行う理由はないworksheets.items[i].load('name');

2)必要はありませんので、あなたは、単にctx.workbook.worksheetsコレクションからシートを得ることができますあなたはちょうどロードしました(すなわち、ctx.workbook.worksheets.items[0])。

3)これはあなたのコードが

function getUsedRanges() { 
    Excel.run(function (ctx) { 
     var worksheets = ctx.workbook.worksheets; 
     worksheets.load('name'); 
     return ctx.sync() 
      .then(function() { 
       var usedRange = []; 
       for (var i = 0; i < worksheets.items.length; i++) { 
        usedRange[i] = worksheet.getUsedRange(); 
        usedRange[i].load('address'); 
       }; 
      }) 
      .then(ctx.sync) 
      .then(function() { 
       for (var i = 0; i < worksheets.items.length; i++) { 
        console.log(usedRange[i].address); 
       } 
      }) 
    }) 
} 

〜マイケル・Zlatkovsky、オフィス拡張のチームの開発者、MSFT

+0

[昨日の質問]のために...あなたにマイケルをありがとうございます(httpなることができますを意味します/ /stackoverflow.com/a/37871688/702977)、グローバル初期の「ワークブック」や「ワークシート」を保存する方法がないので、後でそれらのプロパティのいくつか(例えば、 'items'、' name')を読み込むことができます必要ならば?言い換えれば、最初にすべてのプロパティ(後で必要とする)をロードし、変数に保存する必要がありますか(このスレッドのような)? – SoftTimur

+1

はい、それは正しいです –

+1

一つ:私は実際には、 'worksheet.load(' items ') 'の代わりに上記の間違いがあったことを認識しました' worksheet.load( "name") ' –

関連する問題