Check checkboxes based on CSV file input

A user asked us:

I hope this message finds you well. I am writing to seek guidance on how to select multiple checkboxes based on the answers provided in a single field of a CSV file. Despite my best efforts, I have not found any information on the support site or through various online searches.

Could you please provide some direction or resources on how to achieve this task? If possible, a sample code or detailed instructions would be greatly appreciated.

Thank you for your assistance, and I look forward to your response.

Thanks for providing a test website. → I recorded a macro on this website and found that Ui.Vision records several commands for each checkbox click. But only one of the commands is correct! You need to delete the other commands from the macro:

Once that is done, you can use “IF” command to control the click based on the content from the CSV file:

{
  "Name": "checkbox from csv",
  "CreationDate": "2025-5-7",
  "Commands": [
    {
      "Command": "open",
      "Target": "https://form.jotform.com/251178891979074",
      "Value": "",
      "Description": ""
    },
    {
      "Command": "store",
      "Target": "check",
      "Value": "a3",
      "Description": "This would be content from the CSV, e. g. ${!COL3}"
    },
    {
      "Command": "store",
      "Target": "check",
      "Value": "a4",
      "Description": "would be ${!COL4}"
    },
    {
      "Command": "if",
      "Target": "${a3}==\"check\"",
      "Value": "",
      "Description": ""
    },
    {
      "Command": "click",
      "Target": "id=label_input_5_2",
      "Value": "",
      "Description": "click on box to check it"
    },
    {
      "Command": "end",
      "Target": "",
      "Value": "",
      "Description": ""
    },
    {
      "Command": "if",
      "Target": "${a4}==\"check\"",
      "Value": "",
      "Description": ""
    },
    {
      "Command": "click",
      "Target": "id=label_input_5_3",
      "Value": "",
      "Description": "click on box to check it"
    },
    {
      "Command": "end",
      "Target": "",
      "Value": "",
      "Description": ""
    }
  ]
}

Can you show how it would be done if you are given this csv file https://drive.google.com/file/d/1aZPYT5mTjUIH8241jCdAEFp4Suh4nADa/view?usp=sharing

Does it have to be in this format? The csv input file would be easier to parse (for the ui vision macro) if you have one column per check box.

So instead of

use

date, first, last, phone, question1, question2, question3

28 Apr 25, Joe, blow, 999 888 777, check, - , check

In my example, question 1 and 3 would be checked, question 2 not.

Yes it does have to be in this format. I was able to do this no problem in imacros

How did you parse the CSV file in imacros? If you paste your imacros logic here, maybe I can “translate” it to uivsion.

SET !ERRORIGNORE YES
SET !TIMEOUT_STEP 0

'Pool Features

SET POOLFEATURES_CB_Nb -1
'>
ADD POOLFEATURES_CB_Nb 1
SET Option_POOLFEATURES_CB  EVAL("var n='{{POOLFEATURES_CB_Nb}}'; var c='{{!COL39}}'; var z=c.split('; '); z[n];")
TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ID:Form1 ATTR=ID:Input_115_{{Option_POOLFEATURES_CB}} CONTENT=YES
'>
ADD POOLFEATURES_CB_Nb 1
SET Option_POOLFEATURES_CB  EVAL("var n='{{POOLFEATURES_CB_Nb}}'; var c='{{!COL39}}'; var z=c.split('; '); z[n];")
TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ID:Form1 ATTR=ID:Input_115_{{Option_POOLFEATURES_CB}} CONTENT=YES
'>
ADD POOLFEATURES_CB_Nb 1
SET Option_POOLFEATURES_CB  EVAL("var n='{{POOLFEATURES_CB_Nb}}'; var c='{{!COL39}}'; var z=c.split('; '); z[n];")
TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ID:Form1 ATTR=ID:Input_115_{{Option_POOLFEATURES_CB}} CONTENT=YES
'>
ADD POOLFEATURES_CB_Nb 1
SET Option_POOLFEATURES_CB  EVAL("var n='{{POOLFEATURES_CB_Nb}}'; var c='{{!COL39}}'; var z=c.split('; '); z[n];")
TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ID:Form1 ATTR=ID:Input_115_{{Option_POOLFEATURES_CB}} CONTENT=YES
'>
ADD POOLFEATURES_CB_Nb 1
SET Option_POOLFEATURES_CB  EVAL("var n='{{POOLFEATURES_CB_Nb}}'; var c='{{!COL39}}'; var z=c.split('; '); z[n];")
TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ID:Form1 ATTR=ID:Input_115_{{Option_POOLFEATURES_CB}} CONTENT=YES
'>
ADD POOLFEATURES_CB_Nb 1
SET Option_POOLFEATURES_CB  EVAL("var n='{{POOLFEATURES_CB_Nb}}'; var c='{{!COL39}}'; var z=c.split('; '); z[n];")
TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ID:Form1 ATTR=ID:Input_115_{{Option_POOLFEATURES_CB}} CONTENT=YES
'>
ADD POOLFEATURES_CB_Nb 1
SET Option_POOLFEATURES_CB  EVAL("var n='{{POOLFEATURES_CB_Nb}}'; var c='{{!COL39}}'; var z=c.split('; '); z[n];")
TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ID:Form1 ATTR=ID:Input_115_{{Option_POOLFEATURES_CB}} CONTENT=YES
'>
ADD POOLFEATURES_CB_Nb 1
SET Option_POOLFEATURES_CB  EVAL("var n='{{POOLFEATURES_CB_Nb}}'; var c='{{!COL39}}'; var z=c.split('; '); z[n];")
TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ID:Form1 ATTR=ID:Input_115_{{Option_POOLFEATURES_CB}} CONTENT=YES
'>
ADD POOLFEATURES_CB_Nb 1
SET Option_POOLFEATURES_CB  EVAL("var n='{{POOLFEATURES_CB_Nb}}'; var c='{{!COL39}}'; var z=c.split('; '); z[n];")
TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ID:Form1 ATTR=ID:Input_115_{{Option_POOLFEATURES_CB}} CONTENT=YES
'>
ADD POOLFEATURES_CB_Nb 1
SET Option_POOLFEATURES_CB  EVAL("var n='{{POOLFEATURES_CB_Nb}}'; var c='{{!COL39}}'; var z=c.split('; '); z[n];")
TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ID:Form1 ATTR=ID:Input_115_{{Option_POOLFEATURES_CB}} CONTENT=YES
'>
ADD POOLFEATURES_CB_Nb 1
SET Option_POOLFEATURES_CB  EVAL("var n='{{POOLFEATURES_CB_Nb}}'; var c='{{!COL39}}'; var z=c.split('; '); z[n];")
TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ID:Form1 ATTR=ID:Input_115_{{Option_POOLFEATURES_CB}} CONTENT=YES
'>
ADD POOLFEATURES_CB_Nb 1
SET Option_POOLFEATURES_CB  EVAL("var n='{{POOLFEATURES_CB_Nb}}'; var c='{{!COL39}}'; var z=c.split('; '); z[n];")
TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ID:Form1 ATTR=ID:Input_115_{{Option_POOLFEATURES_CB}} CONTENT=YES
'>
ADD POOLFEATURES_CB_Nb 1
SET Option_POOLFEATURES_CB  EVAL("var n='{{POOLFEATURES_CB_Nb}}'; var c='{{!COL39}}'; var z=c.split('; '); z[n];")
TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ID:Form1 ATTR=ID:Input_115_{{Option_POOLFEATURES_CB}} CONTENT=YES
'>
ADD POOLFEATURES_CB_Nb 1
SET Option_POOLFEATURES_CB  EVAL("var n='{{POOLFEATURES_CB_Nb}}'; var c='{{!COL39}}'; var z=c.split('; '); z[n];")
TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ID:Form1 ATTR=ID:Input_115_{{Option_POOLFEATURES_CB}} CONTENT=YES
'>
ADD POOLFEATURES_CB_Nb 1
SET Option_POOLFEATURES_CB  EVAL("var n='{{POOLFEATURES_CB_Nb}}'; var c='{{!COL39}}'; var z=c.split('; '); z[n];")
TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ID:Form1 ATTR=ID:Input_115_{{Option_POOLFEATURES_CB}} CONTENT=YES
'>
ADD POOLFEATURES_CB_Nb 1
SET Option_POOLFEATURES_CB  EVAL("var n='{{POOLFEATURES_CB_Nb}}'; var c='{{!COL39}}'; var z=c.split('; '); z[n];")
TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ID:Form1 ATTR=ID:Input_115_{{Option_POOLFEATURES_CB}} CONTENT=YES
'>
ADD POOLFEATURES_CB_Nb 1
SET Option_POOLFEATURES_CB  EVAL("var n='{{POOLFEATURES_CB_Nb}}'; var c='{{!COL39}}'; var z=c.split('; '); z[n];")
TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ID:Form1 ATTR=ID:Input_115_{{Option_POOLFEATURES_CB}} CONTENT=YES
'>
ADD POOLFEATURES_CB_Nb 1
SET Option_POOLFEATURES_CB  EVAL("var n='{{POOLFEATURES_CB_Nb}}'; var c='{{!COL39}}'; var z=c.split('; '); z[n];")
TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ID:Form1 ATTR=ID:Input_115_{{Option_POOLFEATURES_CB}} CONTENT=YES
'>
ADD POOLFEATURES_CB_Nb 1
SET Option_POOLFEATURES_CB  EVAL("var n='{{POOLFEATURES_CB_Nb}}'; var c='{{!COL39}}'; var z=c.split('; '); z[n];")
TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ID:Form1 ATTR=ID:Input_115_{{Option_POOLFEATURES_CB}} CONTENT=YES
'>
ADD POOLFEATURES_CB_Nb 1
SET Option_POOLFEATURES_CB  EVAL("var n='{{POOLFEATURES_CB_Nb}}'; var c='{{!COL39}}'; var z=c.split('; '); z[n];")
TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ID:Form1 ATTR=ID:Input_115_{{Option_POOLFEATURES_CB}} CONTENT=YES
'>
ADD POOLFEATURES_CB_Nb 1
SET Option_POOLFEATURES_CB  EVAL("var n='{{POOLFEATURES_CB_Nb}}'; var c='{{!COL39}}'; var z=c.split('; '); z[n];")
TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ID:Form1 ATTR=ID:Input_115_{{Option_POOLFEATURES_CB}} CONTENT=YES
'>
ADD POOLFEATURES_CB_Nb 1
SET Option_POOLFEATURES_CB  EVAL("var n='{{POOLFEATURES_CB_Nb}}'; var c='{{!COL39}}'; var z=c.split('; '); z[n];")
TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ID:Form1 ATTR=ID:Input_115_{{Option_POOLFEATURES_CB}} CONTENT=YES
'>
ADD POOLFEATURES_CB_Nb 1
SET Option_POOLFEATURES_CB  EVAL("var n='{{POOLFEATURES_CB_Nb}}'; var c='{{!COL39}}'; var z=c.split('; '); z[n];")
TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ID:Form1 ATTR=ID:Input_115_{{Option_POOLFEATURES_CB}} CONTENT=YES
'>
ADD POOLFEATURES_CB_Nb 1
SET Option_POOLFEATURES_CB  EVAL("var n='{{POOLFEATURES_CB_Nb}}'; var c='{{!COL39}}'; var z=c.split('; '); z[n];")
TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ID:Form1 ATTR=ID:Input_115_{{Option_POOLFEATURES_CB}} CONTENT=YES
'>

??

SET !ERRORIGNORE YES
SET !TIMEOUT_STEP 0

'Pool Features

The imacros script refers to some column 39, but the sample CSV you posted above has only 5 columns?

SET Option_POOLFEATURES_CB  EVAL("var n='{{POOLFEATURES_CB_Nb}}'; var c='{{!COL39}}'; var z=c.split('; '); z[n];")
TAG POS=1 TYPE=INPUT:CHECKBOX FORM=ID:Form1 ATTR=ID:Input_115_{{Option_POOLFEATURES_CB}} CONTENT=YES

What does this line actually do? :thinking:

I am currently facing a challenge with a CSV file that contains over 100 columns. The example I provided earlier was created by me due to security restrictions, which limited my ability to share the actual data.

My question remains the same: I need guidance on selecting multiple checkboxes based on the values in a specific field of the CSV file. In this case, column 39 lists pool features. I would like the UI.Vision macro to select only the checkboxes corresponding to the answers in column 39. Specifically, from the 15 available checkbox options, I need to select “belowground” “concrete” and “stairs” only.

Thank you for your assistance!

I think the macro in my post above is already the solution.

The only change needed is if the CSV has the checkbox answers in the format of your screenshot:

Type Option 1,
Type Option 2,
Type Option 3,

→ Then you need to parse this CSV row string for the numbers 1,2,… to see if a box needs to be checked.

You could have a logic like “If this string contains 1, then check box 1…” (and so on). You can search the forum for substring parsing to find examples.

So instead of

    {
      "Command": "if",
      "Target": "${a3}==\"check\"",
      "Value": "",
      "Description": ""
    },

you would have a substring check for (in this case) the number 3:

    {
      "Command": "if",
      "Target": "${a3}.lastIndexOf(\"3\") > -1 == true"",
      "Value": "",
      "Description": "check if string contains the number 3"
    },

I would like the UI.Vision macro to select only the checkboxes corresponding to the answers in column 39. Specifically, from the 15 available checkbox options, I need to select “belowground” “concrete” and “stairs” only.

Something like this should work then:

  {
      "Command": "if",
      "Target": "${a39}.lastIndexOf(\"belowground\") > -1 == true"",
      "Value": "",
      "Description": "check if string contains the number 3"
    },
  • Logic to check the belowground box
  • end
  {
      "Command": "if",
      "Target": "${a39}.lastIndexOf(\"concrete\") > -1 == true"",
      "Value": "",
      "Description": "check if string contains the number 3"
    },
  • Logic to check the concrete box
  • end

so there is a if/end logic for every box to check. A39 would be the content of the row. iMacros never had if/end commands, that is why it was solved differently there, with some tricky Javascript.