Bulk action script

154 views
Skip to first unread message

David Acebes

unread,
May 16, 2025, 2:09:47 PM5/16/25
to mementodatabase
Hi,
I have a library with a bulk script. My intention is select entries and apply this script only at this selection but only applies at first.
And a error on script of syntax (line 17) is another problem:

let horas = arg('Horas');
let acciones = arg('Acciones')

let entries=selectedEntries();
for(let ent=0;ent<entries.length;ent++){
if(entry().field('Técnico Asignado')!=null){
entry().set('Fecha Reparacion', Date.now());
if(entry().field('Mano')=='Indiferente'||entry().field('Mano')==''){
entry().set('Numero de Horas', horas)
}
else{
entry().set('Numero de Horas', horas/'2');
entry().set('Acciones Realizadas', acciones);
entry().set('Estado', 'Finalizado');
message('Cerrados albaranes correctamente');
exit();}
else{
message('Técnico no asignado, Cancelado');
}

Can anyone help me?, thanks

David Acebes

unread,
May 16, 2025, 2:17:26 PM5/16/25
to mementodatabase
Correct the syntax error but still no work in selected entries:

let horas = arg('Horas');
let acciones = arg('Acciones')
let entries=selectedEntries();

for(let ent=0;ent<entries.length;ent++){

if(entry().field('Técnico Asignado')!=''){


entry().set('Fecha Reparacion', Date.now());

if(entry().field('Mano')=='Indiferente'||entry().field('Mano')==''){
entry().set('Numero de Horas', horas)
}

else{
entry().set('Numero de Horas', horas/'2');
}
entry().set('Acciones Realizadas', acciones);
entry().set('Estado', 'Finalizado');
message('Cerrados albaranes correctamente');
}

else{


message('Técnico no asignado, Cancelado');
}}

Thanks

Er Mo

unread,
May 16, 2025, 4:38:39 PM5/16/25
to mementodatabase
Hallo
Du hast einen Fehler mit " entry() " . Das ist der Lokal ausgewählte Eintrag und NICHT die zu  Durchlaufenden Einträge  . Versuche anstatt " entry().set(....) " " entries[ent],set(....) "

Hola
Tienes un error con "entry()". Esta es la entrada seleccionada localmente y NO las entradas que se van a recorrer. En lugar de "entry().set(....)", intente "entry[ent],set(....)".

Ernst

David Acebes

unread,
May 16, 2025, 5:18:39 PM5/16/25
to mementodatabase
Thanks but only change first selected entry. And if 'Tecnico Asignado' array is empty change values of first entry:

let horas = arg('Horas');
let acciones = arg('Acciones')
let entries=selectedEntries();

for(let ent=0;ent<entries.length;ent++){

if(entry(ent).field('Técnico Asignado')!=''){
entry(ent).set('Fecha Reparacion', Date.now());

if(entry(ent).field('Mano')=='Indiferente'||entry(ent).field('Mano')==''){
entry(ent).set('Numero de Horas', horas)
}

else{
entry(ent).set('Numero de Horas', horas/'2');
}
entry(ent).set('Acciones Realizadas', acciones);
entry(ent).set('Estado', 'Finalizado');
message('Cerrados albaranes correctamente');
}

else{
message('Técnico no asignado, Cancelado');
}}
 
Any help?

Elizabeth Dixon

unread,
May 16, 2025, 5:19:41 PM5/16/25
to David Acebes, mementodatabase
Testing

--
You received this message because you are subscribed to the Google Groups "mementodatabase" group.
To unsubscribe from this group and stop receiving emails from it, send an email to mementodataba...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/mementodatabase/df8c4371-46a2-4103-aa9c-1b63b3fce97cn%40googlegroups.com.

David Acebes

unread,
May 16, 2025, 5:26:03 PM5/16/25
to mementodatabase

Bill Crews

unread,
May 16, 2025, 5:27:14 PM5/16/25
to David Acebes, mementodatabase
The array of selected entries is named entries. To move through them one by one, you need to use entries[ent] and make ent start at 0 and go through entries.length -1. Don't ever call the entry() function in this kind of script. 


--

David Acebes

unread,
May 16, 2025, 5:57:37 PM5/16/25
to mementodatabase
If change entry(ent) by entries(ent) give an error: org.mozilla.javascript.EcmaError: TypeError: entries is not a function, it is object. (Finalizar en lote.js#7)

Bill Crews

unread,
May 16, 2025, 6:10:20 PM5/16/25
to David Acebes, mementodatabase
Why didn't you change entry(ent) to entries[ent], as both Ernst and I have suggested? 


David Acebes

unread,
May 16, 2025, 6:27:36 PM5/16/25
to mementodatabase
Sorry bill, i don't understand...
I try change and error occours.

Can tell me exactly where i change?, thanks

Mmm

unread,
May 17, 2025, 5:33:17 AM5/17/25
to mementodatabase
Не проверял, доступа к библиотеке нет. 

let horas = arg("Horas");
let acciones = arg("Acciones");
let entries = selectedEntries();

for (let ent of entries) {
    if (ent.field("Técnico Asignado")) {
        ent.set("Fecha Reparacion", Date.now());

        if (ent.field("Mano") == "Indiferente" || ent.field("Mano") == "") {
            ent.set("Numero de Horas", horas);
        } else {
            ent.set("Numero de Horas", horas / 2);
        }

        ent.set("Acciones Realizadas", acciones);
        ent.set("Estado", "Finalizado");

    } else {
        message("Técnico no asignado, Cancelado");
        ent.show();
        exit();
    }
}

message("Arriba cerrado correctamente");

Я предлагаю использовать цикл for...of для перебора выделенных записей, будет меньше ошибок и визуально проще. 

Сообщения message() в исходной варианте отображаются для каждой записи и не будут иметь смысла, если выделено много записей. Лучше сделать одно итоговое сообщение после выполнения цикла. 

Возможно более целесообразным будет остановка и выход из цикла, если в одной из записей не указан технический специалист. Открыть эту запись с помощью show() для устранения ошибки учета. 

Кроме того, всегда можно использовать фильтры и запускать скрипт только для записей, в которых специалист указан. 

суббота, 17 мая 2025 г. в 01:27:36 UTC+3, ace...@gmail.com:

David Acebes

unread,
May 17, 2025, 5:38:02 AM5/17/25
to mementodatabase
Ok, thanks Mmm. Its works fine but only one detail: if array "Técnico Asignado" is empty, message apears and cancel all process without changes.
It's possible?

Mmm

unread,
May 17, 2025, 7:18:09 AM5/17/25
to mementodatabase
Не совсем понял вопрос. 
Поле "Técnico Asignado" является массивом? 

Скрипт выполняется до первой записи с пустым специалистом. В этом случае выполнение прерывается и открывается найденная запись. После заполнения специалиста нужно повторно выделить записи и запустить скрипт. 
Если прерывать скрипт не нужно закомментируйте строки:

//ent.show();
//exit();

Покажите структуру библиотеки. 

суббота, 17 мая 2025 г. в 12:38:02 UTC+3, ace...@gmail.com:

David Acebes

unread,
May 17, 2025, 7:26:40 AM5/17/25
to mementodatabase
Yes is a array, but it's empty can't do any changes and notify by message

Mmm

unread,
May 17, 2025, 7:34:42 AM5/17/25
to mementodatabase
Вы хотите проверить поле "Técnico Asignado" (массив) во всех выделенных записях и отменить выполнение скрипта если есть хотя бы одна запись, в которой это поле пустое. 
Правильно? 

суббота, 17 мая 2025 г. в 14:26:40 UTC+3, ace...@gmail.com:

Mmm

unread,
May 17, 2025, 7:52:38 AM5/17/25
to mementodatabase
let horas = arg("Horas");
let acciones = arg("Acciones");
let entries = selectedEntries();

let filter = entries.filter((a) => a.field("Técnico Asignado").length == 0);

if (filter.length > 0) {
    message("Técnico no asignado, Cancelado");
    exit();
}

for (let ent of entries) {
    ent.set("Fecha Reparacion", Date.now());

    if (ent.field("Mano") == "Indiferente" || ent.field("Mano") == "") {
        ent.set("Numero de Horas", horas);
    } else {
        ent.set("Numero de Horas", horas / 2);
    }

    ent.set("Acciones Realizadas", acciones);
    ent.set("Estado", "Finalizado");
}

message("Arriba cerrado correctamente");

суббота, 17 мая 2025 г. в 14:34:42 UTC+3, Mmm:

David Acebes

unread,
May 17, 2025, 8:45:32 AM5/17/25
to mementodatabase
Perfect all, thanks a lot
Reply all
Reply to author
Forward
0 new messages