Scrape Values from a Filter Definition Web Page

The following loop displays each of the console.log text arguments to a separate line

var ifr = document.getElementById('filter-box');
var ifrDoc = ifr.contentDocument || ifr.contentWindow.document;
var i;
var rulerows = ifrDoc.getElementsByClassName("rulerow");
var rowcount = rulerows.length;
for (i=0; i < rowcount; i++)
{
 console.log(ifrDoc.getElementById('header'+i).value);
 console.log(ifrDoc.getElementById('rule_op'+i).value);
 console.log(ifrDoc.getElementById('rule_target'+i).value);
}

That loop displays as follows in the console ...

a
b
c
d
e
f

How do I instead save each iteration of the loop's output to a single line with each argument separated by a space such as ...

a b c
d e f

The data should appear in a single KM popup and to a file named "Saved Output.txt"

Something like this, except with your values.

(() => {

   let rowcount = 3;
   let val1 = 1;
   let val2 = 2;
   let val3 = 3;
   let valueArray = [];

   for (i=0; i < rowcount; i++) {
      valueArray.push(val1 + ' ' + val2 + ' ' + val3);
   }

   return valueArray.join('\n');

})();

and console.log accepts multiple arguments, spacing outputs on the same line

console.log("a", "b", "c")

console: log() method – Mozilla

so you can also use a pattern roughly along the (untested – I don't have that page in front of me) lines of:

(() => {
    "use strict";

    const
        ifr = document.getElementById("filter-box"),
        ifrDoc = (
            ifr.contentDocument || ifr.contentWindow.document
        ),
        ruleRows = Array.from(
            ifrDoc.getElementsByClassName("rulerow")
        );

    ruleRows.forEach((_, i) =>
        console.log(
            ifrDoc.getElementById(`header${i}`).value,
            ifrDoc.getElementById(`rule_op${i}`).value,
            ifrDoc.getElementById(`rule_target${i}`).value
        )
    );
})();


Array.prototype.forEach() - JavaScript | MDN


Or, perhaps, defining a single string, something like:

(() => {
    "use strict";

    const
        ifr = document.getElementById("filter-box"),
        ifrDoc = (
            ifr.contentDocument || ifr.contentWindow.document
        ),
        ruleRows = Array.from(
            ifrDoc.getElementsByClassName("rulerow")
        );

    return ruleRows.map((_, i) =>
        [
            ifrDoc.getElementById(`header${i}`).value,
            ifrDoc.getElementById(`rule_op${i}`).value,
            ifrDoc.getElementById(`rule_target${i}`).value
        ]
        .join(" ")
    )
    .join("\n");
})();

Array.prototype.map() - JavaScript | MDN

Thank you for your time. This elegant solution worked perfectly. I am trying to post the finished macro but am having trouble with the instructions at Select Clipboard Image File. Can you point me to more explicit directions?

The post you link to is 9 years old!!

Here’s more up to date instructions for you https://wiki.keyboardmaestro.com/Forum#How_to_PostUpload_Your_Macro_to_the_Forum

Thank you!

Here's my macro

Display formatted array to popup KM window and save in file to desktop

Display formatted array to popup KM window and save in file to desktop.kmmacros (3.9 KB)

Keyboard Maestro Export

1 Like

This macro requires a web page with the specified element to operate.

Please provide a link to an appropriate page.

The site is password protected. Here's the HTML, which required
editing the macro to replace the iframe related code with simple document code.


<!DOCTYPE html>

<html lang="en" class="iframe">


<body class="task-settings action-plugin-managesieve-action" style="flex-direction:column;display:flex;">
	



	<h1 class="voice">Filter definition</h1>


<div class="formcontent">
	<form name="filterform" class="propform" action="./" method="post">
<input type="hidden" name="_token" value="uiKfbsoXJfKhhFYMuhX9jDAqXzLNdyW6"><input type="hidden" name="_task" value="settings"><input type="hidden" name="_action" value="plugin.managesieve-save"><input type="hidden" name="_framed" value="1"><input type="hidden" name="_fid" value="1">
<div class="form-group row"><label for="_name" class="col-sm-4 col-form-label">Filter name</label><div class="col-sm-8"><input name="_name" id="_name" size="30" class="form-control" value="Filter for Blocked" type="text"></div></div>
<div class="form-group row form-check"><label for="fenabled" class="col-sm-4 col-form-label">Filter enabled</label><div class="col-sm-8 form-check"><input type="checkbox" id="fenabled" name="_enabled" value="1" checked /></div></div>
<div class="form-group row"><label for="_join" class="col-sm-4 col-form-label">Scope</label><div class="col-sm-8"><select name="_join" id="_join" class="custom-select" onchange="rule_join_radio(this.value)">
<option value="allof">matching all of the following rules</option><option value="anyof" selected>matching any of the following rules</option><option value="any">all messages</option></select></div></div><div id="rules">
<fieldset><legend>Rules</legend>
<div class="rulerow" id="rulerow0">
<table class="compact-table"><tr><td class="rowactions"><div class="flexbox"><select name="_header[0]" id="header0" onchange="rule_header_select(0)" class="custom-select form-control">
<option value="subject">Subject</option><option value="from">From</option><option value="to">To</option><option value="authentication-results" selected>authentication-results</option><option value="received">received</option><option value="return-path">return-path</option><option value="...">...</option><option value="size">Size</option></select><textarea disabled class="" placeholder="Header name" title="Header name" data-type="list" data-size="15" name="_custom_header[0]" style="display:none" id="custom_header0"></textarea>
<textarea disabled class="" data-type="list" data-size="15" name="_custom_var[0]" style="display:none" id="custom_var0"></textarea>
</div></td><td class="rowtargets"><div class="flexbox"><select name="_rule_op[0]" id="rule_op0" style="display:inline" class="operator_selector col-6 custom-select" onchange="rule_op_select(this, '0')">
<option value="contains" selected>contains</option><option value="notcontains">not contains</option><option value="is">is equal to</option><option value="notis">is not equal to</option><option value="exists">exists</option><option value="notexists">not exists</option><option value="matches">matches expression</option><option value="notmatches">not matches expression</option></select><textarea class="" data-type="list" name="_rule_target[0]" style="display:inline;" id="rule_target0">.xyz</textarea>
<div id="rule_size0" class="input-group" style="display:none"><select name="_rule_size_op[0]" id="rule_size_op0" class="input-group-prepend custom-select">
<option value="over">over</option><option value="under">under</option></select><input type="text" name="_rule_size_target[0]" id="rule_size_i0" style="width:auto" class="">
<select name="_rule_size_item[0]" id="rule_size_item0" class="input-group-append custom-select" style="width:auto">
<option value="">B</option><option value="K">KB</option><option value="M">MB</option><option value="G">GB</option></select></div></div>
<div id="rule_advanced0" style="display:none" class="advanced"><div id="rule_mod0" class="adv input-group"><span class="label input-group-prepend"><span class="input-group-text">modifier:</span></span><select name="_rule_mod[0]" id="rule_mod_op0" class="custom-select" onchange="rule_mod_select(0)">
<option value="">none</option><option value="address">address</option></select></div><div id="rule_mod_type0" class="adv input-group" style="display:none"><span class="label input-group-prepend"><span class="input-group-text">type:</span></span><select name="_rule_mod_type[0]" id="rule_mod_type0" class="custom-select">
<option value="all">all</option><option value="domain">domain</option><option value="localpart">local part</option></select></div><div id="rule_comp0" class="adv input-group"><span class="label input-group-prepend"><span class="input-group-text">comparator:</span></span><select name="_rule_comp[0]" id="rule_comp_op0" class="custom-select">
<option value="">default</option><option value="i;octet">strict (octet)</option><option value="i;ascii-casemap">case insensitive (ascii-casemap)</option></select></div><div id="rule_trans0" class="adv input-group" style="display:none"><span class="label input-group-prepend"><span class="input-group-text">modifier:</span></span><select name="_rule_trans[0]" id="rule_trans_op0" class="custom-select" onchange="rule_trans_select(0)">
<option value="text">text</option><option value="raw">undecoded (raw)</option><option value="content">content type</option></select><input type="text" name="_rule_trans_type[0]" id="rule_trans_type0" value="" size="20" style="display:none" class=""></div></div></td><td class="rowbuttons"><a href="#" id="ruleadv0" title="Advanced options" onclick="rule_adv_switch(0, this); return false" class="advanced show btn"><span class="inner">Advanced options</span></a><a href="#" id="ruleadd0" title="Add" onclick="rcmail.managesieve_ruleadd('0'); return false" class="button create add btn"><span class="inner">Add</span></a><a href="#" id="ruledel0" title="Delete" onclick="rcmail.managesieve_ruledel('0'); return false" class="button delete del btn"><span class="inner">Delete</span></a></td></tr></table></div>
<div class="rulerow" id="rulerow1">
<table class="compact-table"><tr><td class="rowactions"><div class="flexbox"><select name="_header[1]" id="header1" onchange="rule_header_select(1)" class="custom-select form-control">
<option value="subject">Subject</option><option value="from">From</option><option value="to">To</option><option value="authentication-results">authentication-results</option><option value="received" selected>received</option><option value="return-path">return-path</option><option value="...">...</option><option value="size">Size</option></select><textarea disabled class="" placeholder="Header name" title="Header name" data-type="list" data-size="15" name="_custom_header[1]" style="display:none" id="custom_header1"></textarea>
<textarea disabled class="" data-type="list" data-size="15" name="_custom_var[1]" style="display:none" id="custom_var1"></textarea>
</div></td><td class="rowtargets"><div class="flexbox"><select name="_rule_op[1]" id="rule_op1" style="display:inline" class="operator_selector col-6 custom-select" onchange="rule_op_select(this, '1')">
<option value="contains" selected>contains</option><option value="notcontains">not contains</option><option value="is">is equal to</option><option value="notis">is not equal to</option><option value="exists">exists</option><option value="notexists">not exists</option><option value="matches">matches expression</option><option value="notmatches">not matches expression</option></select><textarea class="" data-type="list" name="_rule_target[1]" style="display:inline" id="rule_target1">.ru</textarea>
<div id="rule_size1" class="input-group" style="display:none"><select name="_rule_size_op[1]" id="rule_size_op1" class="input-group-prepend custom-select">
<option value="over">over</option><option value="under">under</option></select><input type="text" name="_rule_size_target[1]" id="rule_size_i1" style="width:auto" class="">
<select name="_rule_size_item[1]" id="rule_size_item1" class="input-group-append custom-select" style="width:auto">
<option value="">B</option><option value="K">KB</option><option value="M">MB</option><option value="G">GB</option></select></div></div>
<div id="rule_advanced1" style="display:none" class="advanced"><div id="rule_mod1" class="adv input-group"><span class="label input-group-prepend"><span class="input-group-text">modifier:</span></span><select name="_rule_mod[1]" id="rule_mod_op1" class="custom-select" onchange="rule_mod_select(1)">
<option value="">none</option><option value="address">address</option></select></div><div id="rule_mod_type1" class="adv input-group" style="display:none"><span class="label input-group-prepend"><span class="input-group-text">type:</span></span><select name="_rule_mod_type[1]" id="rule_mod_type1" class="custom-select">
<option value="all">all</option><option value="domain">domain</option><option value="localpart">local part</option></select></div><div id="rule_comp1" class="adv input-group"><span class="label input-group-prepend"><span class="input-group-text">comparator:</span></span><select name="_rule_comp[1]" id="rule_comp_op1" class="custom-select">
<option value="">default</option><option value="i;octet">strict (octet)</option><option value="i;ascii-casemap">case insensitive (ascii-casemap)</option></select></div><div id="rule_trans1" class="adv input-group" style="display:none"><span class="label input-group-prepend"><span class="input-group-text">modifier:</span></span><select name="_rule_trans[1]" id="rule_trans_op1" class="custom-select" onchange="rule_trans_select(1)">
<option value="text">text</option><option value="raw">undecoded (raw)</option><option value="content">content type</option></select><input type="text" name="_rule_trans_type[1]" id="rule_trans_type1" value="" size="20" style="display:none" class=""></div></div></td><td class="rowbuttons"><a href="#" id="ruleadv1" title="Advanced options" onclick="rule_adv_switch(1, this); return false" class="advanced show btn"><span class="inner">Advanced options</span></a><a href="#" id="ruleadd1" title="Add" onclick="rcmail.managesieve_ruleadd('1'); return false" class="button create add btn"><span class="inner">Add</span></a><a href="#" id="ruledel1" title="Delete" onclick="rcmail.managesieve_ruledel('1'); return false" class="button delete del btn"><span class="inner">Delete</span></a></td></tr></table></div>
<div class="rulerow" id="rulerow2">
<table class="compact-table"><tr><td class="rowactions"><div class="flexbox"><select name="_header[2]" id="header2" onchange="rule_header_select(2)" class="custom-select form-control">
<option value="subject">Subject</option><option value="from">From</option><option value="to">To</option><option value="authentication-results">authentication-results</option><option value="received" selected>received</option><option value="return-path">return-path</option><option value="...">...</option><option value="size">Size</option></select><textarea disabled class="" placeholder="Header name" title="Header name" data-type="list" data-size="15" name="_custom_header[2]" style="display:none" id="custom_header2"></textarea>
<textarea disabled class="" data-type="list" data-size="15" name="_custom_var[2]" style="display:none" id="custom_var2"></textarea>
</div></td><td class="rowtargets"><div class="flexbox"><select name="_rule_op[2]" id="rule_op2" style="display:inline" class="operator_selector col-6 custom-select" onchange="rule_op_select(this, '2')">
<option value="contains" selected>contains</option><option value="notcontains">not contains</option><option value="is">is equal to</option><option value="notis">is not equal to</option><option value="exists">exists</option><option value="notexists">not exists</option><option value="matches">matches expression</option><option value="notmatches">not matches expression</option></select><textarea class="" data-type="list" name="_rule_target[2]" style="display:inline" id="rule_target2">.club</textarea>
<div id="rule_size2" class="input-group" style="display:none"><select name="_rule_size_op[2]" id="rule_size_op2" class="input-group-prepend custom-select">
<option value="over">over</option><option value="under">under</option></select><input type="text" name="_rule_size_target[2]" id="rule_size_i2" style="width:auto" class="">
<select name="_rule_size_item[2]" id="rule_size_item2" class="input-group-append custom-select" style="width:auto">
<option value="">B</option><option value="K">KB</option><option value="M">MB</option><option value="G">GB</option></select></div></div>
<div id="rule_advanced2" style="display:none" class="advanced"><div id="rule_mod2" class="adv input-group"><span class="label input-group-prepend"><span class="input-group-text">modifier:</span></span><select name="_rule_mod[2]" id="rule_mod_op2" class="custom-select" onchange="rule_mod_select(2)">
<option value="">none</option><option value="address">address</option></select></div><div id="rule_mod_type2" class="adv input-group" style="display:none"><span class="label input-group-prepend"><span class="input-group-text">type:</span></span><select name="_rule_mod_type[2]" id="rule_mod_type2" class="custom-select">
<option value="all">all</option><option value="domain">domain</option><option value="localpart">local part</option></select></div><div id="rule_comp2" class="adv input-group"><span class="label input-group-prepend"><span class="input-group-text">comparator:</span></span><select name="_rule_comp[2]" id="rule_comp_op2" class="custom-select">
<option value="">default</option><option value="i;octet">strict (octet)</option><option value="i;ascii-casemap">case insensitive (ascii-casemap)</option></select></div><div id="rule_trans2" class="adv input-group" style="display:none"><span class="label input-group-prepend"><span class="input-group-text">modifier:</span></span><select name="_rule_trans[2]" id="rule_trans_op2" class="custom-select" onchange="rule_trans_select(2)">
<option value="text">text</option><option value="raw">undecoded (raw)</option><option value="content">content type</option></select><input type="text" name="_rule_trans_type[2]" id="rule_trans_type2" value="" size="20" style="display:none" class=""></div></div></td><td class="rowbuttons"><a href="#" id="ruleadv2" title="Advanced options" onclick="rule_adv_switch(2, this); return false" class="advanced show btn"><span class="inner">Advanced options</span></a><a href="#" id="ruleadd2" title="Add" onclick="rcmail.managesieve_ruleadd('2'); return false" class="button create add btn"><span class="inner">Add</span></a><a href="#" id="ruledel2" title="Delete" onclick="rcmail.managesieve_ruledel('2'); return false" class="button delete del btn"><span class="inner">Delete</span></a></td></tr></table></div>
<div class="rulerow" id="rulerow3">
<table class="compact-table"><tr><td class="rowactions"><div class="flexbox"><select name="_header[3]" id="header3" onchange="rule_header_select(3)" class="custom-select form-control">
<option value="subject">Subject</option><option value="from">From</option><option value="to">To</option><option value="authentication-results" selected>authentication-results</option><option value="received">received</option><option value="return-path">return-path</option><option value="...">...</option><option value="size">Size</option></select><textarea disabled class="" placeholder="Header name" title="Header name" data-type="list" data-size="15" name="_custom_header[3]" style="display:none" id="custom_header3"></textarea>
<textarea disabled class="" data-type="list" data-size="15" name="_custom_var[3]" style="display:none" id="custom_var3"></textarea>
</div></td><td class="rowtargets"><div class="flexbox"><select name="_rule_op[3]" id="rule_op3" style="display:inline" class="operator_selector col-6 custom-select" onchange="rule_op_select(this, '3')">
<option value="contains" selected>contains</option><option value="notcontains">not contains</option><option value="is">is equal to</option><option value="notis">is not equal to</option><option value="exists">exists</option><option value="notexists">not exists</option><option value="matches">matches expression</option><option value="notmatches">not matches expression</option></select><textarea class="" data-type="list" name="_rule_target[3]" style="display:inline" id="rule_target3">.cam</textarea>
<div id="rule_size3" class="input-group" style="display:none"><select name="_rule_size_op[3]" id="rule_size_op3" class="input-group-prepend custom-select">
<option value="over">over</option><option value="under">under</option></select><input type="text" name="_rule_size_target[3]" id="rule_size_i3" style="width:auto" class="">
<select name="_rule_size_item[3]" id="rule_size_item3" class="input-group-append custom-select" style="width:auto">
<option value="">B</option><option value="K">KB</option><option value="M">MB</option><option value="G">GB</option></select></div></div>
<div id="rule_advanced3" style="display:none" class="advanced"><div id="rule_mod3" class="adv input-group"><span class="label input-group-prepend"><span class="input-group-text">modifier:</span></span><select name="_rule_mod[3]" id="rule_mod_op3" class="custom-select" onchange="rule_mod_select(3)">
<option value="">none</option><option value="address">address</option></select></div><div id="rule_mod_type3" class="adv input-group" style="display:none"><span class="label input-group-prepend"><span class="input-group-text">type:</span></span><select name="_rule_mod_type[3]" id="rule_mod_type3" class="custom-select">
<option value="all">all</option><option value="domain">domain</option><option value="localpart">local part</option></select></div><div id="rule_comp3" class="adv input-group"><span class="label input-group-prepend"><span class="input-group-text">comparator:</span></span><select name="_rule_comp[3]" id="rule_comp_op3" class="custom-select">
<option value="">default</option><option value="i;octet">strict (octet)</option><option value="i;ascii-casemap">case insensitive (ascii-casemap)</option></select></div><div id="rule_trans3" class="adv input-group" style="display:none"><span class="label input-group-prepend"><span class="input-group-text">modifier:</span></span><select name="_rule_trans[3]" id="rule_trans_op3" class="custom-select" onchange="rule_trans_select(3)">
<option value="text">text</option><option value="raw">undecoded (raw)</option><option value="content">content type</option></select><input type="text" name="_rule_trans_type[3]" id="rule_trans_type3" value="" size="20" style="display:none" class=""></div></div></td><td class="rowbuttons"><a href="#" id="ruleadv3" title="Advanced options" onclick="rule_adv_switch(3, this); return false" class="advanced show btn"><span class="inner">Advanced options</span></a><a href="#" id="ruleadd3" title="Add" onclick="rcmail.managesieve_ruleadd('3'); return false" class="button create add btn"><span class="inner">Add</span></a><a href="#" id="ruledel3" title="Delete" onclick="rcmail.managesieve_ruledel('3'); return false" class="button delete del btn"><span class="inner">Delete</span></a></td></tr></table></div>
</fieldset>
</div>
<fieldset><legend>Actions</legend>
<div id="actions"><div class="actionrow" id="actionrow0">
<table class="compact-table"><tr><td class="rowactions"><select name="_action_type[0]" id="action_type0" class="custom-select form-control" onchange="action_type_select(0)">
<option value="fileinto" selected>Move message to</option><option value="redirect">Redirect message to</option><option value="reject">Discard with message</option><option value="discard">Delete message</option><option value="keep">Keep message in Inbox</option><option value="stop">Stop evaluating rules</option></select></td><td class="rowtargets"><span id="redirect_target0" class="input-group" style="white-space:nowrap; display:none"><input type="text" name="_action_target[0]" id="action_target0" value="" size="35" style="width:auto" class="form-control"></span><textarea name="_action_target_area[0]" id="action_target_area0" rows="3" cols="35" class="" style="display:none"></textarea><div id="action_vacation0" style="display:none" class="composite"><span class="label">Message body (vacation reason):</span><br><textarea name="_action_reason[0]" id="action_reason0" rows="3" cols="35" class=""></textarea><br><span class="label">Message subject:</span><br><input type="text" name="_action_subject[0]" id="action_subject0" value="" size="35" class=""><br><span class="label">Reply sender address:</span><br><input type="text" name="_action_from[0]" id="action_from0" value="" size="35" class=""><br><span class="label">My e-mail addresses:</span><br><textarea class="" data-type="list" data-size="30" name="_action_addresses[0]" style="display:none" id="action_addresses0"></textarea><a href="#" onclick="rcmail.managesieve_vacation_addresses(0)">Fill with all my addresses</a><br><span class="label">How often send messages:</span><br><div class="input-group"><input type="text" name="_action_interval[0]" id="action_interval0" value="" size="2" class="">
<span class="input-group-append"><span class="input-group-text">days</span></span></div></div><div id="action_flags0" style="display:none" class="checklist"><label><input type="checkbox" name="_action_flags[0][]" value="\Seen">Read</label><br><label><input type="checkbox" name="_action_flags[0][]" value="\Answered">Answered</label><br><label><input type="checkbox" name="_action_flags[0][]" value="\Flagged">Flagged</label><br><label><input type="checkbox" name="_action_flags[0][]" value="\Deleted">Deleted</label><br><label><input type="checkbox" name="_action_flags[0][]" value="\Draft">Draft</label><br><textarea class="" id="action_flags_flag0" data-type="list" name="_action_flags[0]" style="display:none"></textarea></div><div id="action_set0" style="display:none"><span class="label">Variable name:</span><br><input type="text" name="_action_varname[0]" id="action_varname0" value="" size="35" class=""><br><span class="label">Variable value:</span><br><input type="text" name="_action_varvalue[0]" id="action_varvalue0" value="" size="35" class=""><br><span class="label">Modifiers:</span><br><input type="checkbox" name="_action_varmods[0][]" value="lower" id="action_varmods0lower">lower-case<br><input type="checkbox" name="_action_varmods[0][]" value="upper" id="action_varmods0upper">upper-case<br><input type="checkbox" name="_action_varmods[0][]" value="lowerfirst" id="action_varmods0lowerfirst">first character lower-case<br><input type="checkbox" name="_action_varmods[0][]" value="upperfirst" id="action_varmods0upperfirst">first character upper-case<br><input type="checkbox" name="_action_varmods[0][]" value="quotewildcard" id="action_varmods0quotewildcard">quote special characters<br><input type="checkbox" name="_action_varmods[0][]" value="length" id="action_varmods0length">length</div><div id="action_notify0" style="display:none" class="composite"><span class="label">Notification target:</span><br><div class="input-group"><select name="_action_notifymethod[0]" id="_action_notifymethod0" class="input-group-prepend custom-select ">
<option value="mailto">Email</option></select><input type="text" name="_action_notifytarget[0]" id="action_notifytarget0" value="" size="25" class=""></div><br><span class="label">Notification message (optional):</span><br><textarea name="_action_notifymessage[0]" id="action_notifymessage0" rows="3" cols="35" class=""></textarea><br><span class="label">Importance:</span><br><select name="_action_notifyimportance[0]" id="_action_notifyimportance0" class="custom-select ">
<option value="3">low</option><option value="2" selected>normal</option><option value="1">high</option></select><div id="action_notifyoption_div0"><span class="label">Notification options (optional):</span><br><textarea class="" data-type="list" data-size="30" name="_action_notifyoption[0]" style="display:none" id="action_notifyoption0"></textarea></div></div><select name="_action_mailbox[0]" id="action_mailbox0" class="form-control custom-select" style="display:inline">
<option value="INBOX">Inbox</option><option value="Drafts">Drafts</option><option value="Sent Items">Sent Items</option><option value="Spam">Spam</option><option value="Trash">Trash</option><option value="Blocked" selected>Blocked</option><option value="Mailer-Daemon">Mailer-Daemon</option></select></td><td class="rowbuttons"><a href="#" id="actionadd0" title="Add" onclick="rcmail.managesieve_actionadd(0)" class="button create add btn"><span class="inner">Add</span></a><a href="#" id="actiondel0" title="Delete" onclick="rcmail.managesieve_actiondel(0)" class="button delete del btn"><span class="inner">Delete</span></a></td></tr></table></div>
<div class="actionrow" id="actionrow1">
<table class="compact-table"><tr><td class="rowactions"><select name="_action_type[1]" id="action_type1" class="custom-select form-control" onchange="action_type_select(1)">
<option value="fileinto">Move message to</option><option value="redirect">Redirect message to</option><option value="reject">Discard with message</option><option value="discard">Delete message</option><option value="keep">Keep message in Inbox</option><option value="stop" selected>Stop evaluating rules</option></select></td><td class="rowtargets"><span id="redirect_target1" class="input-group" style="white-space:nowrap; display:none"><input type="text" name="_action_target[1]" id="action_target1" value="" size="35" style="width:auto" class="form-control"></span><textarea name="_action_target_area[1]" id="action_target_area1" rows="3" cols="35" class="" style="display:none"></textarea><div id="action_vacation1" style="display:none" class="composite"><span class="label">Message body (vacation reason):</span><br><textarea name="_action_reason[1]" id="action_reason1" rows="3" cols="35" class=""></textarea><br><span class="label">Message subject:</span><br><input type="text" name="_action_subject[1]" id="action_subject1" value="" size="35" class=""><br><span class="label">Reply sender address:</span><br><input type="text" name="_action_from[1]" id="action_from1" value="" size="35" class=""><br><span class="label">My e-mail addresses:</span><br><textarea class="" data-type="list" data-size="30" name="_action_addresses[1]" style="display:none" id="action_addresses1"></textarea><a href="#" onclick="rcmail.managesieve_vacation_addresses(1)">Fill with all my addresses</a><br><span class="label">How often send messages:</span><br><div class="input-group"><input type="text" name="_action_interval[1]" id="action_interval1" value="" size="2" class="">
<span class="input-group-append"><span class="input-group-text">days</span></span></div></div><div id="action_flags1" style="display:none" class="checklist"><label><input type="checkbox" name="_action_flags[1][]" value="\Seen">Read</label><br><label><input type="checkbox" name="_action_flags[1][]" value="\Answered">Answered</label><br><label><input type="checkbox" name="_action_flags[1][]" value="\Flagged">Flagged</label><br><label><input type="checkbox" name="_action_flags[1][]" value="\Deleted">Deleted</label><br><label><input type="checkbox" name="_action_flags[1][]" value="\Draft">Draft</label><br><textarea class="" id="action_flags_flag1" data-type="list" name="_action_flags[1]" style="display:none"></textarea></div><div id="action_set1" style="display:none"><span class="label">Variable name:</span><br><input type="text" name="_action_varname[1]" id="action_varname1" value="" size="35" class=""><br><span class="label">Variable value:</span><br><input type="text" name="_action_varvalue[1]" id="action_varvalue1" value="" size="35" class=""><br><span class="label">Modifiers:</span><br><input type="checkbox" name="_action_varmods[1][]" value="lower" id="action_varmods1lower">lower-case<br><input type="checkbox" name="_action_varmods[1][]" value="upper" id="action_varmods1upper">upper-case<br><input type="checkbox" name="_action_varmods[1][]" value="lowerfirst" id="action_varmods1lowerfirst">first character lower-case<br><input type="checkbox" name="_action_varmods[1][]" value="upperfirst" id="action_varmods1upperfirst">first character upper-case<br><input type="checkbox" name="_action_varmods[1][]" value="quotewildcard" id="action_varmods1quotewildcard">quote special characters<br><input type="checkbox" name="_action_varmods[1][]" value="length" id="action_varmods1length">length</div><div id="action_notify1" style="display:none" class="composite"><span class="label">Notification target:</span><br><div class="input-group"><select name="_action_notifymethod[1]" id="_action_notifymethod1" class="input-group-prepend custom-select ">
<option value="mailto">Email</option></select><input type="text" name="_action_notifytarget[1]" id="action_notifytarget1" value="" size="25" class=""></div><br><span class="label">Notification message (optional):</span><br><textarea name="_action_notifymessage[1]" id="action_notifymessage1" rows="3" cols="35" class=""></textarea><br><span class="label">Importance:</span><br><select name="_action_notifyimportance[1]" id="_action_notifyimportance1" class="custom-select ">
<option value="3">low</option><option value="2" selected>normal</option><option value="1">high</option></select><div id="action_notifyoption_div1"><span class="label">Notification options (optional):</span><br><textarea class="" data-type="list" data-size="30" name="_action_notifyoption[1]" style="display:none" id="action_notifyoption1"></textarea></div></div><select name="_action_mailbox[1]" id="action_mailbox1" class="form-control custom-select" style="display:none">
<option value="INBOX">Inbox</option><option value="Drafts">Drafts</option><option value="Sent Items">Sent Items</option><option value="Spam">Spam</option><option value="Trash">Trash</option><option value="Blocked">Blocked</option><option value="Mailer-Daemon">Mailer-Daemon</option></select></td><td class="rowbuttons"><a href="#" id="actionadd1" title="Add" onclick="rcmail.managesieve_actionadd(1)" class="button create add btn"><span class="inner">Add</span></a><a href="#" id="actiondel1" title="Delete" onclick="rcmail.managesieve_actiondel(1)" class="button delete del btn"><span class="inner">Delete</span></a></td></tr></table></div>
</div>
</fieldset>
</form>
</div>


<div class="formbuttons">
	<button class="btn btn-primary submit" type="button" id="rcmbtnfrm101" onclick="return rcmail.command('plugin.managesieve-save','',this,event)" value="Save" disabled>Save</button>
</div>


</body>
</html>
1 Like

Here's the edited macro

Display formatted array to popup KM window and save in file to desktop v2

Display formatted array to popup KM window and save in file to desktop copy.kmmacros (3.8 KB)

Keyboard Maestro Export

1 Like

A screenshot of the output:

image

Thanks for providing the means to test the macro.

I'd adjust the JavaScript just a bit:

(() => {

   let i;
   let rulerows = document.getElementsByClassName("rulerow");
   let rowcount = rulerows.length;
   let valueArray = [];
   
   for (i=0; i < rowcount; i++) {
      let val1 = document.getElementById('header'+i).value;
      let val2 = document.getElementById('rule_op'+i).value;
      let val3 = document.getElementById('rule_target'+i).value;
      valueArray.push(val1 + ' ' + val2 + ' ' + val3);
   }
      
   return valueArray.join('\n');
   
})();

and I haven't tested but .map can often reduce the burden of declaring empty lists and counters, and pushing into the lists.

Perhaps something like:

Note – if we're not declaring variables, then we can skip the (() => { ... })() creation of a temporary namespace.

Expand disclosure triangle to view JS source
Array.from(
    document.getElementsByClassName("rulerow")
)
.map(
    (_, i) => ["header", "rule_op", "rule_target"]
    .map(k => document.getElementById(k + i).value)
    .join(" ")
)
.join("\n");

Array.prototype.map() - JavaScript | MDN

2 Likes