FormulaCamp
Пройдено
14. Office Scripts и Power Automate · ExcelScript API · 25 мин

2. ExcelScript: Range, значения и формулы

Урок 2 из 6
Задание 1 из 2
  1. В D2:D7 получите то, что скрипт запишет в row[3]: цена × количество, а при количестве от 10 — со скидкой 10%.

Теория урока

В Office Scripts всё начинается с объекта книги workbook, который передаётся в main. Цепочка вызовов «книга → лист → диапазон»:

  • workbook.getWorksheet("Лист1") — лист по имени, workbook.getActiveWorksheet() — активный лист;
  • sheet.getRange("A2:D7") — диапазон, sheet.getUsedRange() — вся заполненная область;
  • getValue() / setValue(x) — одна ячейка; getValues() / setValues(массив) — двумерный массив строк;
  • setFormula("=SUM(D2:D7)") — формула (по-английски, с запятыми); getFormat().getFont().setBold(true), getFormat().getFill().setColor("yellow") — оформление;
  • range.getCell(0, 0) — ячейка внутри диапазона, отсчёт с нуля.

Главное отличие от VBA: индексы массивов в TypeScript начинаются с 0. В строке row из A2:D7 row[0] — это A, row[3] — D. И ещё: setValues требует массив ровно того же размера, что диапазон.

function main(workbook: ExcelScript.Workbook) {
  const sheet = workbook.getWorksheet("Лист1");
  const range = sheet.getRange("A2:D7");
  const values = range.getValues();           // 6 строк × 4 столбца

  for (const row of values) {
    const price = row[1] as number;
    const qty = row[2] as number;
    row[3] = qty >= 10 ? price * qty * 0.9 : price * qty;   // скидка 10% от 10 штук
  }
  range.setValues(values);                    // одна запись на лист вместо шести

  sheet.getRange("D8").setFormula("=SUM(D2:D7)");
  sheet.getRange("A8:D8").getFormat().getFont().setBold(true);
}

Запись условие ? да : нет — короткий «если» в TypeScript. as number сообщает языку, что в ячейке число. Получите формулами то, что запишет скрипт.

Тренажёр не выполняет макросы и скрипты. Код из урока запускайте в настольном Excel (VBA) или в Excel для Интернета (Office Scripts). Здесь вы учитесь читать код и проверяете себя формулами и тестом.

Проверьте себя

1. Код: const v = sheet.getRange("A1:C4").getValues(); console.log(v.length, v[0].length). Что выведется?
2. values получены из B2:E10. Какой столбец листа соответствует row[2]?
3. Что вернёт sheet.getRange("C3:F8").getCell(0, 0).getAddress()?
4. Найдите ошибку: sheet.getRange("A1:B2").setValues([[1, 2, 3], [4, 5, 6]]);
5. Какой строкой сделать заливку A1:D1 жёлтой?
6. Почему в примере values пишутся на лист одним setValues, а не setValue в каждую ячейку в цикле?
fx

Enter — ввести · F2 — изменить · F4 — $ в ссылке · Ctrl+C/Ctrl+V — копировать · Ctrl+Z — отменить

Esc или F6 — выйти из таблицы к кнопке «Проверить» · Shift+Tab в первой ячейке — к началу страницы