javascriptsharepoint-2013sharepoint-designer

How do I activate a SharePoint 2013 workflow with a button (javascript?)


Good morning. I am new to the coding world, so my skills growing daily. I am trying to activate a SharePoint 2013 list workflow by using a button and Javascript. I know there are plenty of examples available, and to be honest, I'm a bit embarrassed about not being able to figure this out myself. All the codes that I have seen to date however have initiation variables in them, but my workflow doesn't. I'm at a loss for how to alter the examples to exclude having initiation variables. Please help. Example code I have looked at:

http://ranaictiu-technicalblog.blogspot.com/2013/06/sharepoint-2013-start-workflow-with.html https://www.codeproject.com/Articles/607127/Using-SharePoint-2013-Workflow-Services-JS-API#example5 https://sharepoint.stackexchange.com/questions/236329/start-sharepoint-designer-workflow-2013-using-javascript

I used the following code from first link:

//dialog element to show during processing
var dlg = null;      

//Subscription id - Workflow subscription id
//list item id for which to start workflow. If site workflow, then send null for itemId

function StartWorkflow(subscriptionId, itemId) {
   showInProgressDialog();
   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) {
           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) {
                   closeInProgressDialog();
               },
               function (sender, args) {
                   closeInProgressDialog();
                   alert('Failed to run workflow');
               }
           );
       },
       function (sender, args) {
           closeInProgressDialog();
           alert('Failed to run workflow');
       }
   );
 }

function closeInProgressDialog() {
   if (dlg != null) {
       dlg.close();
   }
}
 

function showInProgressDialog() {
   if (dlg == null) {
       dlg = SP.UI.ModalDialog.showWaitScreenWithNoClose("Please wait...", "Waiting for workflow...", null, null);
   }
}

And inserted the following HTML to create the button.

<button onclick="function StartWorkflow('8E645164-959C-4358-B22C-47FDA93F7906',5)">Click Me</button>

I am 100% confident that my subscriptionId and my itemId are correct.

Please help.

Thank you.


Solution

  • My test code for your reference,it's just slightly different from your code:

    <input type="button" id="test" value="Click Me" />
    <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
    <script src="/_layouts/15/sp.workflowservices.js"></script>    
    <script>
      $("#test").click(function(){
        console.log(1)
        SP.SOD.executeFunc('sp.js', 'SP.ClientContext', init);
      function init() {
        $.getScript(SP.Utilities.Utility.getLayoutsPageUrl('sp.js'), function () {
          $.getScript(SP.Utilities.Utility.getLayoutsPageUrl('sp.workflowservices.js'), function () {
            StartWorkflow("SubscriptionId","itemid","siteurl");
          });
        });
      }
      //dialog element to show during processing
      var dlg = null;
      //Subscription id – Workflow subscription id
      //list item id for which to start workflow. If site workflow, then send null for itemId
      //SiteURL – site collection where the workflow exists
      function StartWorkflow(subscriptionId, itemId, SiteURL) {
        showInProgressDialog();
        var ctx = new SP.ClientContext(SiteURL);
        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) {
            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) {
            closeInProgressDialog(SiteURL);
          },
          function (sender, args) {
            closeInProgressDialog(SiteURL);
            $('#msg')[0].innerHTML = "Woops – something went wrong, the document may have already been reviewed";
          }
        );
      },
      function (sender, args) {
        closeInProgressDialog(SiteURL);
        $('#msg')[0].innerHTML = "Woops – something went wrong, the document may have already been reviewed";
      }
    );
    }
    
      function closeInProgressDialog(SiteURL) {
        if (dlg != null) {
          dlg.close();
          $('#msg')[0].innerHTML = "Thank you – you can now close the page";
        }
      }
      function showInProgressDialog() {
        if (dlg == null) {
          dlg = SP.UI.ModalDialog.showWaitScreenWithNoClose("Please wait…", "Waiting for workflow…", null, null);
        }
      }
      })
      
    </script>