In this article I will show how easy it is to programmatically lock and release the lock on a content control in a word document. This is very helpful when you are populating regions of a document but do not want users to mess with the format of the contents.
Introduction
In the Word 1.3 release of the office.js model, Microsoft release the new “cannotEdit” property of a content control. This is a get and settable property. More information on the properties available are found here in the documentation
Unlocking a content control for editing
Here is my locked content control called “Checklist”. I am going to use the code to get it by Tagname and then unlock it.
In your JavaScript code when you are about to update the control you need to execute the following as a minimum. It seems like a lot of code but it is due to the Promised based architecture used for the Office Add-In APIs.
Word.run(function (context) { var contentControlsWithTag = context.document.contentControls.getByTag('Checklist'); // Queue a command to load the tag property for all of content controls. context.load(contentControlsWithTag, 'tag'); // Synchronize the document state by executing the queued commands, // and return a promise to indicate task completion. return context.sync().then(function () { if (contentControlsWithTag.items.length === 0) { console.log('No content control found.'); } else { return context.sync() .then(function () { //the contentControlsWithTag is always returned as an array of items contentControlsWithTag.items[0].cannotEdit = false; contentControlsWithTag.items[0].insertHtml("<b>Hello World</b>", 'Replace'); }); } }); }) .catch(function (error) { console.log('Error: ' + JSON.stringify(error)); if (error instanceof OfficeExtension.Error) { console.log('Debug info: ' + JSON.stringify(error.debugInfo)); } });
Once you have unlocked the control your code can be inserted and the control is editable. In a real application you just have to make sure you lock averything again with
contentControlsWithTag.items[0].cannotEdit = false; contentControlsWithTag.items[0].insertHtml("<b>Hello World</b>", 'Replace'); contentControlsWithTag.items[0].cannotEdit = true
Conclusion
Nice, simple to use locking control. Yes the users cant unlock this manually and mess with the document, but if they are going there, then it is their own fault. This way no changes can be made “by mistake”.