Дублирование и переименование листов с помощью скрипта

Я работаю в Excel 365 онлайн. Я пытаюсь продублировать определенное количество раз лист шаблона, который затем мне нужно переименовать по значению ячейки.

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

Небольшая помощь будет оценена по достоинству!

function main(workbook: ExcelScript.Workbook) {
    let modele = workbook.getWorksheet("Semaine 36");

    for (i = 1 to 5 );
    // Duplicate worksheet
    let modele_copie = modele.copy(ExcelScript.WorksheetPositionType.after, modele);
    let sheet = workbook.getActiveWorksheet();
    const cellule = sheet.getRange('A3');
    const valeur = cellule.getValue();
    sheet.setName(valeur) 
    next i;
}

1
70
3

Ответы:

Ваш цикл for next не соответствует правилам синтаксиса JavaScript. Этот сценарий работает без ошибок, но в сценарии есть логическая ошибка, поскольку ячейка, которую он читает для получения имени новой вкладки, никогда не меняется, поэтому сценарий пытается использовать одно и то же имя для 5 вкладок снова и снова. Поскольку вы не предоставили информацию об этой логике, я оставлю это на ваше усмотрение.

function main(workbook: ExcelScript.Workbook) {
    let modele = workbook.getWorksheet("Semaine 36");

    for (let i = 1; i<5; i++){
    // Duplicate worksheet
    let modele_copie = modele.copy(ExcelScript.WorksheetPositionType.after, modele);
    let sheet = workbook.getActiveWorksheet();
    const cellule = sheet.getRange('A3');
    const valeur = cellule.getValue().toString();
    Sheet.setName (valeur)
    }
}

Переименуйте копии шаблона с помощью списка

  • Название: Копировать шаблон
  • Описание: копирует лист шаблона столько раз, сколько ячеек имеется в диапазоне поиска.
  • Обратите внимание, я новичок в Office Scripts. Чтобы создать это, я потратил часы на просмотр десятков постов (не жалуясь, просто подчеркивая, какой я нуб).

Короткий

function main(wb: ExcelScript.Workbook) {
    // Return the values of the lookup range in an array.
    let lArr = wb.getWorksheet("Sheet1").getRange("A3:A7").getValues();
    // Referemce the template.
    let tws = wb.getWorksheet("Semaine 36");
    // Use each value in the array to rename a copy of the template
    // created after the last worksheet.
    for (let i = 0; i < lArr.length; i++) {
        tws.copy(ExcelScript.WorksheetPositionType //
            .after, wb.getLastWorksheet()).setName(lArr[i].toString());
    };
}

Образовательный

function main(wb: ExcelScript.Workbook) {
    // Define constants.
    const LOOKUP_SHEET_NAME: string = "Sheet1";
    const LOOKUP_RANGE_ADDRESS: string = "A3:A7";
    const TEMPLATE_SHEET_NAME: string = "Semaine 36";
    // Return the values of the lookup range in an array.
    let lws = wb.getWorksheet(LOOKUP_SHEET_NAME);
    let lrg = lws.getRange(LOOKUP_RANGE_ADDRESS);
    let lData = lrg.getValues();
    // Referemce the template.
    let tws = wb.getWorksheet(TEMPLATE_SHEET_NAME);
    // Use each value in the array as a name for a copy
    // of the template created after the last worksheet.
    for (let i = 0; i < lData.length; i++) {
        let nws = tws.copy(ExcelScript.WorksheetPositionType //
            .after, wb.getLastWorksheet());
        let nwsName: string = lData[i].toString();
        nws.setName(nwsName);   
    };
}

Решено
  • Рассмотрите возможность включения обработки исключений в код, например: если книга содержит лист с тем же именем (скрипт ниже удалит существующие листы с тем же именем), и если список имен листов содержит пустые ячейки (пропустите эти ячейки) и т. д.

  • Скрипт динамически находит список имен рабочих листов на Листе1.

function main(workbook: ExcelScript.Workbook) {
    const startRow = 3; // row# of the first sht name
    const semSht = workbook.getWorksheet("Semaine 36"); // get worksheet object
    const wsSht1 = workbook.getWorksheet("Sheet1")
    // get row# of the last name on Sheet1, index is zero-base
    const lastRow = wsSht1.getRange("A:A").getLastCell().getRangeEdge(ExcelScript.KeyboardDirection.up).getRowIndex() + 1;
    if (lastRow >= startRow) {
        // get all sht names
        const shtNames = wsSht1.getRange(`A${startRow}:A${lastRow}`).getTexts();
        // loop through each name
        shtNames.forEach(sName => {
            let shtName = sName[0]; // get the sht name
            if (shtName) { 
                // try to get the sht object
                let newSht = workbook.getWorksheet(shtName);
                if (newSht) { // remove sht if exists
                    newSht.delete();
                }
                // copy and rename template sht
                semSht.copy(ExcelScript.WorksheetPositionType.after, workbook.getLastWorksheet()).setName(shtName);
            }
        }
        )
    }

}