How to let the Creator Name Changes codes work only for the seletced items?

The changes occur for the whole library, I would like to know how to use it only for the seclected items?

The codes are from https://www.zotero.org/support/dev/client_coding/javascript_api


var oldName = "Robert L. Smith";
var newFirstName = "Robert";
var newLastName = "Smith";
var newFieldMode = 0; // 0: two-field, 1: one-field (with empty first name)

var s = new Zotero.Search();
s.libraryID = ZoteroPane.getSelectedLibraryID();
s.addCondition('creator', 'is', oldName);
var ids = await s.search();
if (!ids.length) {
return "No items found";
}
await Zotero.DB.executeTransaction(async function () {
for (let id of ids) {
let item = await Zotero.Items.getAsync(id);
let creators = item.getCreators();
let newCreators = [];
for (let creator of creators) {
if (`${creator.firstName} ${creator.lastName}`.trim() == oldName) {
creator.firstName = newFirstName;
creator.lastName = newLastName;
creator.fieldMode = newFieldMode;
}
newCreators.push(creator);
}
item.setCreators(newCreators);
await item.save();
}
});
return ids.length + " item(s) updated";
  • From that page, I know I can add condition,
    such as

    var tagName = 'something';
    s.addCondition('tag', 'is', tagName);


    How can I search for the selected items.

    These codes

        zoteroPane = Zotero.getActiveZoteroPane();
        items = zoteroPane.getSelectedItems();
    s.addCondition('items', 'is', items);
    ...

    are invalid

  • Use this in place of the search results:

    var ids = ZoteroPane.getSelectedItems().map(item => item.id);
  • edited March 2, 2021
    Thanks a lot. Would you please paste the whole codes?


    var oldName = "Robert L. Smith";
    var newFirstName = "Robert";
    var newLastName = "Smith";
    var newFieldMode = 0; // 0: two-field, 1: one-field (with empty first name)

    var s = new Zotero.Search();
    s.libraryID = ZoteroPane.getSelectedLibraryID();
    s.addCondition('creator', 'is', oldName);
    //var ids = await s.search();
    var ids = ZoteroPane.getSelectedItems().map(item => item.id);
    if (!ids.length) {
    return "No items found";
    }
    await Zotero.DB.executeTransaction(async function () {
    for (let id of ids) {
    let item = await Zotero.Items.getAsync(id);
    let creators = item.getCreators();
    let newCreators = [];
    for (let creator of creators) {
    if (`${creator.firstName} ${creator.lastName}`.trim() == oldName) {
    creator.firstName = newFirstName;
    creator.lastName = newLastName;
    creator.fieldMode = newFieldMode;
    }
    newCreators.push(creator);
    }
    item.setCreators(newCreators);
    await item.save();
    }
    });
    return ids.length + " item(s) updated";


    return me the numbers items I selected, even no changes occur.
Sign In or Register to comment.