DocuPhase Forms latest - This documentation is for DocuPhase Forms v11.3. Not for you? Earlier documentation is available too.
Google Connector
Does your organization use Google Apps? Combining Google Sheets/Drive and DocuPhase Forms provides interesting and useful ways to solve real business problems. The ability to read and write workflow data from/to a Google Sheet and post documents to Google Drive makes completing routine, day-to-day business tasks easier. DocuPhase Forms provides a Google Connector that supports direct connectivity between DocuPhase Forms and Google Sheets/Drive.
DocuPhase Forms customers building applications that are high volume and address critical business processes should not use Google Sheets in place of a production quality database.
Google Connector Best Practice
Create a Google Shared Drive that hosts all folders and sheets you plan to use with DocuPhase Forms. This helps group all documents and sheets that are maintained by the application. Each folder and sheet must be shared with the service account (see Admin: Manage Connectors.) You may also share the folders and sheets with any other users in your organization who need access to them.
To learn more about Google Shared Drives, view this Google article.
Do not add the service account as a Shared Drive user; rather, click the Share icon for each folder and/or sheet and add that user as a Contributor or Content Manager on it.
We do not recommend sharing parent folders from a user’s ‘My Drive’ because any file/folder created by the connector will be owned by the service account and cannot be deleted easily (e.g. to preserve storage space). There is no direct drive access for the service account.
Sheets shared with the service account cannot be located inside a folder.
Connect a Form/Workflow to Google
Your Tenant Admin must configure the Google Connector in the Admin: Manage Connectors page before you can perform the following steps in the Form/Workflow Document Actions tab.
Add a Document Action
You can add a Document Action at the end of your form/workflow or after any workflow step.
Document Action: Go to your form/workflow's Settings tab in the Guided Designer Navigation bar. Click the Document Actions tab.
Activity Document Action: Click the + icon after any workflow step, then click Add Document Action.
You will automatically be on the Send Documents sub-tab. Click ADD DOCUMENT ACTION and select Send to External System.
Select Send to Google Drive or Send to Google Sheets.
Depending on your selection, see the the sections below for wizard details.
Save Documents to Google Drive
Select a Folder from the available list of option. Only folders that are shared with your Service Account are visible. See Google Connector Best Practice above.
Select a Sub Folder.
You can enter a static name, like “Purchase Orders” or use a template like {Department}, or any combination.
If you use a template, and it resolves to null, the submission’s unique id will be used as the folder name instead.
If the Sub Folder does not yet exist at the time of submission, it will be created.
If the Sub Folder already exists at the time of submissions, the document(s) will be added to it.
Select the document(s) to send.
Send Snapshot - choose your format if you would like to send a snapshot of all the printable forms and fields in your submission.
Check Data if you would like to send the submission.xml document (uncommon).
Check Attachments if you would like to send files uploaded by the user via upload controls.
Choose whether to send Generated (Mapped) PDFs. You may choose all, none, or select specific mapped PDF(s).
Note that when the file is saved to Google Drive, it will be created by (and last modified by) the service account.
Save Data to Google Sheets
Select the Spreadsheet from list. Only sheets that a) shared with the service account and b) not in a folder will be shown. See Google Connector Best Practice above.
Select the Worksheet (this will list the tabs on your sheet).
Map columns.
Each available column will appear in the Column dropdown. Click the blue Add icon to map more columns. Once a column is selected, it is not available to be selected again. Once all available columns are mapped, the “Add” button becomes disabled.
You may enter static text or a template(s) in the corresponding Value field. The column name does not need to match the control name.
Mapping Multi-Value Controls
You can map multi-value controls such as controls inside repeats, table columns, and checkboxes to the same OR separate Google sheet rows.
To map the value to a single row, you can use any regular separator, such as a comma, in your repeat template syntax. This results in a single, comma-separated string value in the target cell. For example, you can map the Items column in a table to a text column named with the syntax {,|Items}. This results in a single value sent to the target Google cell as a comma-separated string, e.g "Widgets, Wingdings, Whatzits".
You can also map a repeat control to separate Google sheet rows. In this case, you must use a special syntax to send separate values. Use the repeat separator 'json'. Example: {json|Items}
In the example below, Color Choices will map to a single cell as a comma-separated list, while Item will map to separate rows.
Business Rules
You may also use business rules to read and update data from Google Sheet. For example, you may wish to maintain a matrix of approvers in a Google Sheet, which DocuPhase Forms reads from and uses for step assignments. The approval matrix sheet can easily be updated by your business users, and DocuPhase Forms instantly reflects the change.
Google Sheets should not be used in place of a production quality database. Reading/updating large datasets can impact performance, and because Google is a 3rd party, DocuPhase cannot assist with potential service interruptions.
Google Sheets Rule Functions
There are two basic functions you can call in business rules.
To read from a sheet, use frevvo.getGoogleSheetRows('<sheet key>','<tab name>','<query>').
To update a sheet, use frevvo.updateGoogleSheetRows('<sheet key>','<tab name>','<query>', ‘update values in JSON format’).
JSON format is {column:value,column2:value2}
You may wish to set up the JSON parameter string in a variable and then pass the variable in your function.
The query is optional (replace with the word null if not using), and you can add multiple queries using ‘and’ or ‘or’ between them inside the same quote set.
The sheet key is the GUID of your Google sheet. Use the key to specify your Google sheet in your rule. To find the Google sheet key,
Open your Google sheet.
The key is the long string of characters between the d/ and the /edit in the URL in the address bar. Ex: https://docs.google.com/spreadsheets/d/1FXYb7PJpozlFcJol12YNEwhFFwa-tvpO6OjU1wzxDTI/edit?usp=sharing
The query is typically structured as “<ColumnHeader>='value'>”. Your value can come from a control in your form.
Create a Dynamic Dropdown List from a Google Sheet
Let's take a look at populating dynamic pick lists (drop downs) from a Google Sheet using a business rule. We’ll use this sample Google Sheet to discuss. It has a row for each employee: First Name, Last Name, Employee Id.
For this example, we have a form with three controls: a Trigger control named ‘Connect’, a Dropdown control named ‘EId’ and a TextArea control named ‘GSResults’. The goal is to populate the options in the Dropdown so that the user sees a list of employee names, and when they select one, the value selected is that employee’s corresponding Employee ID.
Add a rule to read information from the Google Sheet and populate the employee pick list. Here’s an example:
/*member employeeid, firstname, lastname, results*/
var x;
//Condition (when to run the rule)
if (Connect.clicked) {
// declare and set a variable (x) to the result of the special read GS function
var x = frevvo.getGoogleSheetRows('10RkDKC8dXpUxtsPQcxK-mhH4rBIxZthl6Arqx8kBmBY', 'Employees', null);
// Populate the results in a hidden text area
GSResults.value = JSON.stringify(x);
// declare an array variable (opts)
var opts = [''];
// if there were results from GS, loop through them and push each row into the array, in the option syntax format
if (x) {
for (var i = 0; i < x.results.length; i++) {
if (x.results[i].employeeid) {
opts.push(x.results[i].employeeid + '=' + x.results[i].firstname + ' ' + x.results[i].lastname);
}
}
}
// Set the dropdown options to the array created above
EId.options = opts;
}
This rule is triggered by clicking on the Connect button (a Trigger control.) You could also run this rule on form.load.
The parameters for the function frevvo.getGoogleSheetRows are a) the spreadsheet key (the long ID in the URL of the Google Sheet) and b) the tab name, ‘Employees’, and c) null (meaning we are not using a query in this example). Remember to replace the examples with the key and tab name of your sheet.
Parse the results into an array. The array elements are “hagen=Walter Hagen” etc.
Set the options to the array.
For this example, we also populate the TextArea ‘GS Results’ with the full result of the function, which is all data on the specified tab in JSON format. One common practice is to do this operation on form.load, and then populate dropdowns (or prefill other control values) based on the data in your form, rather than making multiple calls to the Google Sheet. This can improve performance and prevent errors if your Google Sheet data is changed before the workflow is fully submitted.
This same model will work for populating options for Radio and Checkbox controls as well.
Prefill Control Values from a Google Sheet
You can initialize your form with data from a Google Sheet using a business rule. The example discussed below uses a form that has a dropdown control to select a customer from a list. Once selected, a business rule queries a Google Sheet and retrieves the full address details for the selected customer. City, State, and Zip Code controls are also populated with the customer information.
Add a rule to read information from a specific row of the google sheet and prefill your form fields. Here is an example:
/*member fulladdress, city,results, state, zipcode*/
//declare and set a variable (x) to the result of the special read GS function
var x = frevvo.getGoogleSheetRows('1Ak9v1SJNAjQu_4lxWv909quyH4bpmbuF2IxjgJM7VBw', 'AddressInfo', "customername='" + SelectCustomer.value + "'");
//error handling - display a message if there is any problem getting results
if (x.results == null) {
FullAddress.value = 'error';
} else if (x.results.length === 0) {
FullAddress.value = 'No Match';
} else { //as long as there are results, display them in the corresponding form fields.
FullAddress.value = x.results[0].fulladdress;
City.value = x.results[0].city;
State.value = x.results[0].state;
Zipcode.value = x.results[0].zipcode;
}
Let's take a look at the components of this rule:
The parameters for the function frevvo.getGoogleSheetRows are a) the spreadsheet key (the long ID in the URL of the Google Sheet) and b) the tab name, ‘Employees’, and c) the query to the row of the selected customer: "customername='" + SelectCustomer.value + "'". Note that the column name is converted to all lower case without spaces. If you want to use spaces, you must enclose the column name in single quotes here. We are also passing in the value of “SelectCustomer”, so that whenever the user changes their selection, the address shown is updated to reflect it.
Multiple Queries
The query string supports ‘and’ and ‘or’ logic. Simply separate your queries in the third parameter by the word ‘and’ or ‘or’. This query will retrieve all rows where the customer lives either in MA or CT by setting the query to "state='MA' or state='CT'". The rule concatenates all the addresses into a text area control named FullAddress when the form loads.
/*member fulladdress, results, password, user*/
if (form.load) {
// Note the 3rd query includes 'or'
var x = frevvo.getGoogleSheetRows('1Ak9v1SJNAjQu_4lxWv909quyH4bpmbuF2IxjgJM7VBw', 'AddressInfo', "state='MA' or state='CT'");
var opts= [];
var fi = '';
if (x.results == null) {
fi = 'Error';
} else if (x.results.length === 0) {
fi = 'No Match';
} else {
for (var i=0; i < x.results.length; i++) {
fi = fi + '\n' + x.results[i].fulladdress;
}
}
FullAddress.value = fi;
}
Update a Google Sheet
Let's take a look at how you can update existing values in a sheet. It’s another common scenario that can be used for a variety of tasks (e.g. limiting the number of submissions for a particular form or creating a sequentially increasing counter). We’ll use this sample Google Sheet to discuss. It has a row for each employee: Employee Id, Location and Extension. The form has three corresponding controls. When Update Google Sheet is clicked, we want to update the location and extension for the selected employee.
Troubleshooting
Doc Action Failure Notifications
If the submission doesn't reach Google, all tenant administrators or workflow admins (if configured) will receive a Doc Post Failure notification email reporting information about the error. The email subject contains the server name where the form/workflow is hosted, and the form/flow name, project name and owner are listed in the email body. The URL shown in the email will tell you whether the failure occurred in regards to a Sheet (look for the word “spreadsheets” in the URL) or Drive (look for the word “documents” in the URL).
Here are some examples:
There are a number of reasons why your data or documents may not post successfully to Google Sheets/Google Drive. Here are some common reasons and troubleshooting actions you can take.
Possible Reason for Doc Post Failure | Try this… |
---|---|
Connection Timeout |
|
Google Sheets Workbook or Sheet deleted/renamed First Column header deleted/renamed |
|
Google Sheet has a column or sheet set as a Protected Range |
|
Google Sheets has reached the limit of 5000000 cells |
|
Google Sheets or Google Drive API is not enabled |
|
Google Drive folder deleted/renamed |
|
Folder/Sheet Not Available in Doc Action Wizard
This is typically a permission issue.
Ensure that the folder or sheet is shared with the Service Account.
Do not add the Service Account as a user on the Shared Drive.
Make sure the Sheet is at the top level in the Shared Drive, not inside a folder.