I run into this the other day as well. The solution was just to add a dummy field id definition: const field_id = 'fld-xxx';. This was all TapForms 5 needed to detect the field dependency and trigger the execution of my field script.
Maybe the API could be enhanced to add a trigger parameter to the field script object that the user can set if needed.
Cheers, Daniel
---
See https://lab.danielleu.com/tapformspro/ for scripts and tips&tricks
Everything you’ve described is correct and is exactly how Field scripts behave.
You’ll need to be explicit about which fields you’re referencing in the getFieldValue('fld-...') function so that Tap Forms knows which fields to monitor. I’m sorry that it doesn’t work the way you want it to. But that’s another level of abstraction that Tap Forms doesn’t know how to deal with. And there could be unintended consequences if I evaluate your JavaScript code just to find out what the Field IDs are when using getFieldNamed() so I can monitor those fields.
Thanks for the reply, Brendan.
I believe your statement (that the getFieldNamed function is not disabled) is somewhat semantic. Maybe I am wrong, but my understanding of what you are saying is that the following process occurs in a field level script:
Prerequisites for execution of a field level script:
1. The function ‘getFieldValue’ MUST be present.
2. A valid fld_ID value MUST be present. This value can be explicit or the value can be contained within a variable.
Process:
1. Tapform’s Objective-C code scans the source code in my script.
2. It finds the function ‘getFieldValue’.
3. It fails to find a valid fld_ID as the code (within the field level script) has yet to be executed as a Javascript.
4. As the prerequisites have not been satisfied, no script execution actually takes place.
What I am saying is that the ‘getFieldNamed’ function and its use within a field level script are basically incompatible as (at the Objective-C code scan stage), there will NEVER be a fld_ID to satisfy the second prerequisite stated above.
That effectively makes useless any inclusion of ‘getFieldNamed’ in a field level script (for its primary function of retrieving a fld_ID). I agree that the function is not disabled, but it is inoperable (useless) within a field level script.
That is my reading of it, but perhaps my understanding of the process above is wrong?
The getFieldNamed() function is not disabled. It just doesn’t cause the field script to be executed when you enter a value into that field in the record. If there was another field that’s referenced with the field ID directly, then that will trigger the script to run.
The trigger is specifically on the getFieldValue() function.
So if I am understanding this correctly, that function (getFieldNamed) is effectively disabled within a field level script.
The script text MUST (at the outset) contain the fld_ID of a field that will “change value”.
So any function that returns the fld_ID will be ineffective in a field level script (unless the script already contains a fld_ID). Perhaps getFieldNamed is the only function that does that?
I cannot think of a workaround as you are very much limited when using a field level script.
Is this correct?
Thanks for help.
The issue is that my Objective-C code scans your source code to determine which fields you’re referencing in the script by looking for the text .getFieldValue('fld-.....'). Or when using a variable instead of ('fld-....'). But it doesn’t execute your code before your function is run to determine what the field ID is for getFieldNamed('Analysis_G2') so that it can trigger the script when that value in that field changes.
It works as a Form script because you’re manually executing the script when you want. But a Field script relies on monitoring the fields in the form to see what’s changed and then it runs the script if the script has a reference to one of those fields with the hard coded field ID.
After you save your script, check the Fields list to see if you see a checkmark next to any of the fields. If so, those are the fields Tap Forms will monitor for changes. If you don’t see any, the script won’t be triggered automatically.
Ya, that would be easier to read and debug with a Script field. But can be done with a Calculation field:
IF(FieldA = 1; DATEADD(FieldC;0;0;-2;0;0;0;0); IF(FieldA = 2 ~ FieldA = 3; DATEADD(FieldC;0;-1;0;0;0;0;0); IF(FieldA > 3; DATEADD(FieldC;0;-2;0;0;0;0;0); "")))
I haven’t tested this, so it might not work, but that’s the general idea. The ~ character means or
Hello Brendan, i am having issues with IF Nesting Functions. I searched and found that it is much simpler/easier to use script. However, i do not know Script. I saw the tutorial and was having a hard time comprehending. Anyway, I hope you can help if the formula. I need Field B to show 3 results, depending on 4 conditions:
if Field A is 1, result is 2 weeks before the date in field C
if Field A is 2 or 3, result is 1 month before the date in Field C
if Field A is more than 3, result is 2 months before the date in Field C
if Field A is 0, Field B should be blank
Thanks so much in advance! TapForms is GREAT!
A javascript runs correctly with a “hard coded” field_ID. It fails however if the field_ID is retrieved using the functions ‘form.getFieldNamed(‘field_name’)’ and ‘object.getId()’.
Can anyone see why this might not work? I intend to use this function in ALL of my forms. Hence the need to source the field_ID from its ‘field name”.
Thanks for any help.
The code is quite straightforward (you can substitute any field id below to test it). If the user enters “XXYY” in the field, it should set that field to ‘null’:
function Script() {
// ***** OPERATES CORRECTLY *****:
// the following two lines of code work correctly (when the field id
// hardcoded).
var analysis_g2_fld_id = ‘fld-37435e1d73024374b4700105e49993c9’;
var analysis_g2_value = record.getFieldValue(‘fld-37435e1d73024374b4700105e49993c9’);
// ***** FAILS *****:
// the following three lines of code do NOT work
// (ie. when the field ID is sourced via functions). If the three
// lines of code below are executed in a “form level script”, it does
// work. It is only when in a “field level script” that it fails.
// analysis_g2_obj = form.getFieldNamed(‘Analysis_G2’);
// var analysis_g2_fld_id = analysis_g2_obj.getId();
// var analysis_g2_value = record.getFieldValue(analysis_g2_fld_id);
if (analysis_g2_value == “XXYY”)
record.setFieldValue(analysis_g2_fld_id, null);
return 0;
}
Script();
form.saveAllChanges();
царь means tsar, all the entries are in cyrillic script. (The definitions are mostly in roman.)
Quite oddly, a simple search — or an advanced search restricted to Domaine — with Aliments et boissons (Food and drinks) doesn’t yield anything, a search with Aliments only either. Instead, boissons yields all the records related to food and drinks…
Hi Stephen,
Just setting the value in the field should trigger the record colour value to update. Can you post a sample form template with your script inside so I can see what’s going wrong?
Even something simple like this works:
function Change_Value() {
var new_field_id = 'fld-eeda81519fa94abab133b9a2b4d7847b';
record.setFieldValue(new_field_id, "Two");
form.saveAllChanges();
}
Change_Value();
Have you made sure that you’re calling form.saveAllChanges()?
Attachments:
You must be
logged in to view attached files.
I have a field for progress Status, it’s formatted as radio buttons from a pick list with 3 values – Pending/Actioned/Archived.
I would like to set the record colour based on this status. null/yellow/green.
I have used the set record colour attribute before, but only set from a tick box, so the logic was simple. Try as I might, I cannot find how to achieve what I want. How is the value of a Radio Button field stored & referenced in the script, for example? I’ve tried as if it were the text, and if it was stored as a number, but no success thus far.
Any advice?
Many thanks, Stephen.
Hello,
following assumption:
I have two forms:
form 1
form 2
I have a script in form 1 (not a script field). How can I get the records that are in form 2 from form 1 and display it in the console?
I tried several days but I can not access the records in form 2.
Regards from germany.
Hi James,
That’s an interesting use case for AI. We’ll see what Apple has up its sleeves for integrating AI into their OS. Right now the script I wrote simply establishes a REST connection to OpenAI and submits a message and gets a response. I also wrote another script I can use for translating forms to different languages. It’s still a work-in-progress though.
I agree better AppleScript and Shortcuts support is needed. You can also call into Tap Forms with a URL that can execute a script. You can even pass Tap Forms parameters that way.
See the section on this page called “Calling a Script from a URL”:
https://www.tapforms.com/help-mac/5.3/en/topic/javascript-api
Thanks,
Brendan
I think you are thinking of calling an LLM from within Tap Forms. That is another use case. I’m suggesting that Brendan look into making sure his tool is set up for the various GenAI tools are able to access Tap Forms database easily. This could be accomplished by providing an API into Tap Forms, AppleScript, or Shortcuts. Each method has pros/cons, but all should probably be pursued.
However, I think that Brendan, like everyone else in the Apple ecosystem, is waiting to see what Apple does with AI. Hopefully, the annual release schedule with long times before actual release will not cause Apple a fall similar to Nokia/Blackberry. And annual release schedule in a world where the state of the technology and tools/products is advancing daily seems like a very bad idea.