Word.run
呼び出しでオブジェクトを使用することはできません。 Word.run
は、呼び出されるたびに新しいコンテキストを作成しますが、元のオブジェクトは独自のコンテキストに結び付けられ、不一致が作成されます。
言われていること、あなたは絶対には、Word.run
の中から、あなたはcontext.trackedObjects.add(obj)
に望むオブジェクトを追加することができ、そして、彼らはWord.runの実行を終了した後も作業オブジェクトとして残ります。 「作業オブジェクト」とは、そのパスが無効化されない(ガベージコレクションに類似していると思うが、リモートオブジェクトに対しては)ことを意味する。
あなたが(そして、それはあなたが行うように上記に見えます)そのようなオブジェクトを持っていたら、あなたは、それはあなたのために働いていない場合
range.select();
range.context.sync().catch(...);
を呼び出すことができる必要があり、あなたがしているエラーの例を提供することができます取得?
完全性を期すために、オブジェクトをtrackedObjectsコレクションに追加すると、それらのオブジェクトのメモリ管理を効果的に自分の手で行うことに注意してください。これは、メモリを適切に解放しないと、はがメモリ/範囲調整チェーンを動かすことによってWordの速度を低下させることを意味します。したがって、追跡されたオブジェクトを使用し終えたら、obj.context.trackedObjects.remove(obj)
と、obj.context.sync()
の順に呼び出してください。最後の部分を忘れないでください。同期を行わないと、追跡されたオブジェクトを削除する要求はディスパッチされず、メモリを使い切ります。
=======アップデート1 =======
トム、エラーメッセージを提供するためのおかげで。これは、APIのWord実装のバグかもしれないようです - 私はそれをフォローアップし、より多くの質問があればあなたに手を差し伸べるかもしれません。概念的な観点から
、あなたは正しい道の上に絶対にある - そして次は、Excelで作業を行い、例えば:
var range;
Excel.run(function (ctx) {
var sheet = ctx.workbook.worksheets.getActiveWorksheet();
range = sheet.getRange("A5");
range.values = [[5]];
ctx.trackedObjects.add(range);
return ctx.sync();
})
.then(function(){
setTimeout(function() {
range.select();
range.context.trackedObjects.remove(range);
range.context.sync();
}, 2000);
})
.catch(function (error) {
showMessage("Error: " + error);
});
=======アップデート2 ==== ===
実際には製品にバグがあります。しかし、良いニュースは、JavaScriptのみの修正で修正するのは簡単だということです。実際、CDNを更新して、今後数週間以内に修正する予定です。修正により
は、次のコードは動作します:
var paragraph;
Word.run(function (ctx) {
var p = ctx.document.body.paragraphs.first;
paragraph = p.next;
ctx.trackedObjects.add(paragraph);
return ctx.sync();
})
.then(function(){
setTimeout(function() {
paragraph.select();
paragraph.context.trackedObjects.remove(paragraph);
paragraph.context.sync()
.then(function() {
console.log("Done");
})
.catch(handleError);
}, 2000);
})
.catch(handleError);
function handleError (error) {
console.log('Error: ' + JSON.stringify(error));
if (error instanceof OfficeExtension.Error) {
console.log('Debug info: ' + JSON.stringify(error.debugInfo));
}
}
はさらに良いニュースをしたいですか? CDNが更新されるまで、以下のコードを使用してJavaScriptライブラリに「パッチを適用」し、上記のコードを実行させることができます。 Office.jsが既にロードされた後(Office.initialize関数内)に、そしてWord.run
を実行する前に、このコードを実行してください。
var TrackedObjects = (function() {
function TrackedObjects(context) {
this._autoCleanupList = {};
this.m_context = context;
}
TrackedObjects.prototype.add = function (param) {
var _this = this;
if (Array.isArray(param)) {
param.forEach(function (item) { return _this._addCommon(item, true); });
}
else {
this._addCommon(param, true);
}
};
TrackedObjects.prototype._autoAdd = function (object) {
this._addCommon(object, false);
this._autoCleanupList[object._objectPath.objectPathInfo.Id] = object;
};
TrackedObjects.prototype._addCommon = function (object, isExplicitlyAdded) {
if (object[OfficeExtension.Constants.isTracked]) {
if (isExplicitlyAdded && this.m_context._autoCleanup) {
delete this._autoCleanupList[object._objectPath.objectPathInfo.Id];
}
return;
}
var referenceId = object[OfficeExtension.Constants.referenceId];
if (OfficeExtension.Utility.isNullOrEmptyString(referenceId) && object._KeepReference) {
object._KeepReference();
OfficeExtension.ActionFactory.createInstantiateAction(this.m_context, object);
if (isExplicitlyAdded && this.m_context._autoCleanup) {
delete this._autoCleanupList[object._objectPath.objectPathInfo.Id];
}
object[OfficeExtension.Constants.isTracked] = true;
}
};
TrackedObjects.prototype.remove = function (param) {
var _this = this;
if (Array.isArray(param)) {
param.forEach(function (item) { return _this._removeCommon(item); });
}
else {
this._removeCommon(param);
}
};
TrackedObjects.prototype._removeCommon = function (object) {
var referenceId = object[OfficeExtension.Constants.referenceId];
if (!OfficeExtension.Utility.isNullOrEmptyString(referenceId)) {
var rootObject = this.m_context._rootObject;
if (rootObject._RemoveReference) {
rootObject._RemoveReference(referenceId);
}
delete object[OfficeExtension.Constants.isTracked];
}
};
TrackedObjects.prototype._retrieveAndClearAutoCleanupList = function() {
var list = this._autoCleanupList;
this._autoCleanupList = {};
return list;
};
return TrackedObjects;
}());
OfficeExtension.TrackedObjects = TrackedObjects;
〜マイケル・Zlatkovsky、オフィス拡張のチームの開発者、TrackedObjectsに加えMSFT
私は 'range.context.sync() 'でIは、次のエラーを取得上記呼び出し:' GeneralException:GeneralException {[機能]を:、 __proto__:{}、 コード:「GeneralException 」 DEBUGINFO:{ [機能]、 __proto__:{}、 errorLocation: "Document._GetObjectByReferenceId" }、 メッセージ: "GeneralException"、 名: "OfficeExtension.Error"、 traceMessages:[] } ' –
Se私の2つの上記アップデート –