Hi Brendan,
it occurs when a record is selected.
The script below doesn‘t run in this error
when I execute it during edit the script.
It returns the title field value,
but it doesn’t change the color as well.
It occurs on iOS 13.2.3 (iPhone)
function Test() {
var title_id = 'fld-f7c25ccc01564c308c96fa08ca0da768';
var result=record.getFieldValue(title_id);
var color='0xFFFEFB00'
record.setRecordColor(color);
var color = record.getRecordColor();
console.log(result)
console.log(color)
}
Test();
Hi Marcus,
I just tested this out and it’s working for me. I first tested in my latest development build that I’ve made enhancements to the scripting engine. But then I tested it using the production version 5.3.8 and it also worked.
Make sure you have a record selected in your form before you run the script.
Since I‘ve installed 5.3.8 (968):
A simple script to read a field value runs in the following error by executing Run – Script (record view):
ReferenceError: Can’t find variable: record, column: x, line: y
When I execute this script in the „edit mode“ it runs without any issues.
function Test() {
var title_id = 'fld-76b2c64fccc34c20b62b7d485f5bfa28';
var result=record.getFieldValue(title_id);
console.log(result)
}
Test();
Hi Captain,
Sorry for not responding sooner.
I’m looking into this issue now. Originally I didn’t have the Contact field accessible in the list of fields on the Script Editor. But I’ve just added that now.
But I still have to look into what kind of information you can get from it still.
Thanks,
Brendan
Hi there,
I run a computer-repair shop and have been using tapforms to keep track of repairs, serial numbers, parts and prices and customer contacts.
I have about a thousand records by now.
I am using the Contact field type to input customer’s names, which works awesome: upon handing in a computer, i input their contact details in the Contacts app on my Mac, and afterwards, i can use the contact-field in tapforms to set up a new record with their name.
During a repair, i am sending status-updates to customers, at the moment i am manually typing these things and using text-expansion tools to rapidly get through standardized texts.
After reading up a bunch on scripting here, it seems to me it should be possible to use a script to send out standardized emails.
I have found so far that it should be possible to create a Web Site type field that is populated with info from other fields to create a mailto link (incl. subject and body info in html code).
However, upon attempting to write something i immediately got stuck because it looks like there is no way to getfieldvalues from a contact type field?
i know it should be possible if i create a separate field where i manually input each customer’s emailaddress, but that would mean an extra field entry.
Too long didnt read-version of my question:
Is there a way for a script to get values from the contact field type?
It’ll require a bit of customisation, I use this with shipping records to mark them delivered and confirmed (unconfirmed shipment delivery would be sync from automated systems). This is the one that grabs from the clipboard, looks for a candidate matching record and then updates it’s state:
var clipboard = Utils.copyTextFromClipboard();
if (clipboard)
{
clipboard = clipboard.split("\n")[0];
}
var tracking_number_id = 'fld-c487390743c947969cbe661cff596855';
var received_date_id = 'fld-e3e3539ee04f4cc7971c7098c572104d';
var confirmed_id = 'fld-2adb9ba8cdd048bbbb614d46b415ada5';
var alternate_tracking_numbers_id = 'fld-cf8718051bea4cc2aba0069ae76f32b7';
var alternate_tracking_number_id = 'fld-7342203d8f36415191bf8419fb6f70dc';
function findRecord()
{
var targetRecord = null;
MainLoop:
for(candidateRecord of form.getRecords())
{
if (clipboard == candidateRecord.getFieldValue(tracking_number_id))
{
targetRecord = candidateRecord;
break MainLoop;
}
for (alternateRecord of candidateRecord.getFieldValue(alternate_tracking_numbers_id))
{
if (clipboard == alternateRecord.getFieldValue(alternate_tracking_number_id))
{
targetRecord = candidateRecord;
break MainLoop;
}
}
}
if (targetRecord)
{
targetRecord.setFieldValue(received_date_id, new Date());
targetRecord.setFieldValue(confirmed_id, true);
document.saveAllChanges();
form.selectRecord(targetRecord);
return "Updated existing record for " + clipboard;
}
else
{
return "Unable to find matching record for " + clipboard;
}
}
findRecord();
This is a similar form script that uses the Prompter to ask for input and then creates a record:
// Order: Shipment Field ID
var shipments_id = 'fld-db2fcdb4d79c466ea09671c47d2ae645';
// Order: Ship Date
var ship_date_id = 'fld-6ab700ccc11d418fbd27d8899d00c7a9';
var ship_date = record.getFieldValue(ship_date_id);
// Shipments: Record Field ID's
var tracking_number_id = 'fld-c487390743c947969cbe661cff596855';
var carrier_id = 'fld-0950c430cb0c41f79c51d43a544b366b';
var shipping_date_id = 'fld-1aa32f17e059424fb4e24bf894b34fdf';
var callbackFunction = function() {
if (tracking_number && carrier)
{
var data = {
[tracking_number_id]: tracking_number,
[carrier_id]: carrier,
};
if (ship_date)
{
data[shipping_date_id] = ship_date;
}
else
{
data[shipping_date_id] = new Date();
}
console.log(JSON.stringify(data));
var shipmentRecord = record.addNewRecordToField(shipments_id);
shipmentRecord.setFieldValues(data);
document.saveAllChanges();
}
};
let prompter = Prompter.new();
prompter.addParameter('Tracking Number', 'tracking_number', 'text')
.addParameter('Carrier', 'carrier', 'picklist', 'Carrier - Shipments')
.show('Message prompt', callbackFunction);
The Prompter stuff uses a callback mechanism which means it’s not blocking so it takes a little bit of work to turn that into a continuous loop but it would be possible to do.
Creating a checkin/checkout flow is certainly possible though, not the most elegant but definitely possible.
Well that showed up… Ill ask my Question again.
I’m brand new to Tap Forms 5 – Still in the trial period – Using it on Mac
When I run the script to import a show it adds a record titled ‘No’ but no information is imported. If I try to run the script again on the script console log I get the error “series already exists undefined” regardless if it’s the same show or not.
URL Used: https://www.imdb.com/title/tt3107288/
Hi David,
I have a fix coming for this issue soon. Just working on an enhancement to the scripting before I can publish the update. Sorry for the trouble.
Thanks,
Brendan
Hi Sam, your approach sounds interesting for making a barcode search more convenient. Can you post your script and tell me where to place the script? I have no experience with the Tapforms script.
I am just wondering: My goal is to create a check in / check out workflow. If the script is already able to pull certain records using a workflow like yours, then could it also do the next step:
1. Prompt for an item barcode, then search for the record in the items form
2. Prompt for a box QR code, then associate it to the item
3. Go back to step 1, unless the user cancels the script by tapping on a “stop” button in the prompt.
What do you think?
An earlier iteration of my approach was to use ScanKey, a barcode scanning iOS keyboard, to scan input and process them. It’s a little clunky in that it jumps to it’s own app to do the scan, I remember needing to tap a button on it before it jumps back to the calling app. It has an OCR feature which is neat as well for when the barcode scanner misbehaved. It was annoying because you had to change the keyboard to activate it and changing the keyboard back, at least with my keyboard setup, was a little weird and it didn’t work properly.
First party support for barcode scanning in scripts would be neat though.
Prompter barcode is in my wishlist as well. I currently use Siri Shortcuts to scan a barcode, copy it to the clipboard, use a tapformz URL to get Tap Forms to open up the right document and form then use Run Script to execute a script. It pulls the barcode from the clipboard and uses that as input to the script. It works reasonably well though I wish there were a way I could directly invoke a script for a document/form/script combination and pass it in parameters.
Thank you for the adivse, Brendan. That helps to streamline my workflow a little bit. Daniel’s suggestion sounds interesting even though I have no clue about the scripting in Tap Forms yet.
Update:
hideField is a parameter to the field object and not to a fieldId:
var field = form.getFieldWithId(fieldID);
field.hideField = true;
Original response:
Two things come to mind looking at the script:
- you might need to run
document.saveAllChanges(); at the end of the script
- sometimes changes done by a script are not directly visible in the GUI, you might need to refresh the record by pressing cmd-r or clicking on the ‘recalculate formulas’ button.
Cheers, Daniel
---
See https://lab.danielleu.com/tapformspro/ for scripts and tips&tricks
While I am not a javascript programmer, I can usually read through simple javascript code and understand what is happening. I am trying to write a simple script to show or hide a link to form field based on the value of a checkbox. Unfortunately it does not seem to be working even though it runs clean in the console log. Is there any quirky bugs in relation to scripts and link to form fields. I have included my simple script for reference. Thank you in advance for any assistance you can provide, it is greatly appreciated.
function New_Script() {
// get the check box id
var the_check_box = ‘fld-25afad2179224c368867d5f688afe496’;
// get value of check box – checked or not
var checked = record.getFieldValue(the_check_box_id);
// get id of the link to form field
var bills_id = ‘fld-3af9c9d4356a4dbba70d1e09a6ef6db5’;
// check if the check box is checked or not
if (checked == true) {
// true condition;
console.log (“show bills”)
bills_id.hideField = false;
} else {
// false condition;
console.log (“hide bills”)
bills_id.hideField = true;
}
}
New_Script();
It would be great to be have a barcode scanning feature using the Prompter(). Than one could write a simple script and have the automation done as needed. This would enable very efficient inventory updates, among others.
Cheers, Daniel
---
See https://lab.danielleu.com/tapformspro/ for scripts and tips&tricks