You can use this function:
function scriptStart(xSelectedItemId, xSubscriptionId) {
//var xSubscriptionId = "{7d028513-b2ea-4ad0-a996-9b807f2beb2e}"
console.log("scriptStartWF.js: Ribbonbutton script started, Workflow subscriptionId==" + xSubscriptionId + ", selected Item Id==" + xSelectedItemId)
var scriptbase = _spPageContextInfo.webAbsoluteUrl + "/_layouts/15/";
$.getScript(scriptbase + "SP.js", function () {
$.getScript(scriptbase + "SP.WorkflowServices.js", function () {
StartWorkflow(xSubscriptionId, xSelectedItemId);
});
});
}
//dialog element to show during processing
//var dlg = null;
//Subscription id - Workflow subscription id --> looked it up in App, does not change.
function StartWorkflow(subscriptionId, itemId) {
fxShowInProgressDialog("Starten Workflow...");
var ctx = SP.ClientContext.get_current();
var wfManager = SP.WorkflowServices.WorkflowServicesManager.newObject(ctx, ctx.get_web());
var subscription = wfManager.getWorkflowSubscriptionService().getSubscription(subscriptionId);
ctx.load(subscription, 'PropertyDefinitions');
ctx.executeQueryAsync(
function (sender, args) {
console.log("scriptStartWF.js: obtaining Workflow Property Definitions...");
var params = new Object();
//Find initiation data to be passed to workflow.
var formData = subscription.get_propertyDefinitions()["FormData"];
if (formData != null && formData != 'undefined' && formData != "") {
var assocParams = formData.split(";#");
for (var i = 0; i < assocParams.length; i++) {
params[assocParams[i]] = subscription.get_propertyDefinitions()[assocParams[i]];
}
}
if (itemId) {
wfManager.getWorkflowInstanceService().startWorkflowOnListItem(subscription, itemId, params);
}
else {
wfManager.getWorkflowInstanceService().startWorkflow(subscription, params);
}
ctx.executeQueryAsync(
function (sender, args) {
console.log("scriptStartWF.js: Workflow Started...")
fxCloseInProgressDialog();
},
function (sender, args) {
fxCloseInProgressDialog();
alert('Failed to run workflow, Error: ' + args.get_message());
}
);
},
function (sender, args) {
fxCloseInProgressDialog();
alert('Failed to run workflow, Error: ' + args.get_message());
}
);
}
function fxShowInProgressDialog(msg) {
dlg = SP.UI.ModalDialog.showWaitScreenWithNoClose("Een ogenblik a.u.b...", msg, null, null);
}
function fxCloseInProgressDialog() {
dlg.close();
}
The XML of my Ribbon button looks like this:
<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<CustomAction Id="ScriptLink.jQuery" Location ="ScriptLink" ScriptSrc="~site/Scripts/jquery-2.1.1.js" />
<CustomAction Id="Ribbon.Library.Actions.Scripts" Location ="ScriptLink" ScriptSrc="~site/Scripts/scriptStartWF.js" />
<CustomAction Id="d1d06df8-d6aa-40ff-8e5c-eeaed3ccbb0e.RibbonBtnStartWfNewWI"
RegistrationType="List"
RegistrationId="101"
Location="CommandUI.Ribbon"
Sequence="10001"
Title="Invoke 'RibbonBtnStartWfNewWI' action">
<CommandUIExtension>
<CommandUIDefinitions>
<CommandUIDefinition Location="Ribbon.Documents.Manage.Controls._children">
<Button Id="Ribbon.Documents.Manage.RibbonBtnStartWfNewWIButton"
Alt="Request RibbonBtnStartWfNewWI"
Sequence="100"
Command="Invoke_RibbonBtnStartWfNewWIButtonRequest"
LabelText="Start Workflow Werkinstr."
TemplateAlias="o1"
Image32by32="_layouts/15/images/placeholder32x32.png"
Image16by16="_layouts/15/images/placeholder16x16.png" />
</CommandUIDefinition>
</CommandUIDefinitions>
<CommandUIHandlers>
<CommandUIHandler Command="Invoke_RibbonBtnStartWfNewWIButtonRequest"
CommandAction="javascript:
var ctx = SP.ClientContext.get_current();
var selectedItems = SP.ListOperation.Selection.getSelectedItems(this.ctx);
var cnt = selectedItems.length;
if (cnt == 1) {
scriptStart({SelectedItemId}, '{7d028513-b2ea-4ad0-a996-9b807f2beb2e}');
}
else {
alert(cnt + ' items geselecteerd. Selecteer precies 1 item a.u.b.');
}"
/>
</CommandUIHandlers>
</CommandUIExtension >
</CustomAction>
</Elements>
for more info check blogpost