Сценарий Office — разделение строк в векторе и использование динамического адреса ячейки — запуск сценария Excel из Power Automate

Я совершенно новичок в Office Script (имею только старый опыт работы с Python и C++), и я пытаюсь запустить довольно «простой» Office Script в excel из Power Automate. Цель состоит в том, чтобы заполнить определенные ячейки (всегда одинаковые, их положение не должно меняться) в файле Excel. Часть Power Automate работает, проблема заключается в том, чтобы использовать информацию, отправленную в Excel, в Excel.

  • Сценарий берет три переменные из PowerAutomate (все три строки) и должен заполнять определенные ячейки на их основе. CMQ_Name: строка для использования как есть.

  • Версия: строка для использования как есть.

  • PT_Name: строка с именами, разделенными знаком «;». Цель состоит в том, чтобы разбить его на столько строк, сколько необходимо (я храню их в массиве) и записать каждое имя в ячейках друг над другом, всегда начиная с одной и той же позиции (ячейка A2).

Я могу использовать CMQ_Names & Version и помещать их в ячейку, в которую они должны входить, я уже заставил это работать.
Однако я не могу заставить работать последнюю часть (выделена жирным шрифтом выше, часть 2 в коде ниже).

Изучение этого было довольно разочаровывающим, поскольку некоторые элементы, кажется, иногда работают, а иногда нет. У новичка у меня, вероятно, больше проблем с синтаксисом, чем у кого-либо еще...

function main(workbook: ExcelScript.Workbook,
  CMQ_Name: string,
  Version: string,
  PT_Name: string ) 
{
// create reference for each sheet in the excel document
let NAMES = workbook.getWorksheet("CMQ_NAMES");
let TERMS = workbook.getWorksheet("CMQ_TERMS");

//------Part 1: Update entries in sheet CMQ_NAMES 
NAMES.getRange("A2").setValues(CMQ_Name);
NAMES.getRange("D2").setValues(Version);

//Update entries in sheet CMQ_TERMS 
TERMS.getRange("A2").setValues(CMQ_Name);

//-------Part 2: work with PT_Name

//Split PT_Name

let ARRAY1: string[] = PT_Name.split(";");
let CELL: string;
let B: string = "B"

for (var i = 0; i < ARRAY1.length; i++) {
 CELL = B.concat(i.toString());
 NAMES.getRange(CELL).setValues(ARRAY1[i]);
 }
}

У меня есть несколько проблем:

  1. Некоторые части (в основном все, что выделено красным цветом) обнаруживаются как проблемы, и я понятия не имею, почему. Некоторые исследования показали, что это может быть ложным срабатыванием, другие — нет. Это также не самая большая проблема, поскольку кажется, что код иногда работает, несмотря на эти предупреждения.

Argument of type 'string' is not assignable to parameter of type '(string | number | boolean)[ ][ ]'.
  1. Я не смог найти способ использовать переменную в качестве адреса для выбора конкретной ячейки для записи, что мешает работе цикла for в конце. Уже неделю ломаю голову над этим, так и не решив.

Не могли бы вы взглянуть?

Спасибо!!

Я пробовал несколько обходных путей и других синтаксисов без особого успеха. Запись первых двух строк в ячейках работает, работа с третьей строкой не работает.

Обновлено: благодаря комментарию ниже мне удалось заставить его работать:

function main(
  workbook: ExcelScript.Workbook,
  CMQ_Name: string,
  Version: string,
  PT_Name: string ) 
{
  // create reference for each table 
  let NAMES = workbook.getWorksheet("CMQ_NAMES");
  let TERMS = workbook.getWorksheet("CMQ_TERMS");

  //------Part 0: clear previous info
  TERMS.getRange("B2:B200").clear()

  //------Part 1: Update entries in sheet CMQ_NAMES 
  NAMES.getRange("A2").setValue(CMQ_Name);
  NAMES.getRange("D2").setValue(Version);

  //Update entries in sheet CMQ_TERMS 
  TERMS.getRange("A2").setValue(CMQ_Name);

  //-------Part 2: work with PT_Name
  //Split PT_Name
  let ARRAY1: string[] = PT_Name.split(";");
  let CELL: string;
  let B: string = "B"

  for (var i = 2; i < ARRAY1.length + 2; i++) {
    CELL = B.concat(i.toString());
    //console.info(CELL); //debugging
    
    TERMS.getRange(CELL).setValue(ARRAY1[i - 2]);
  }
}

Для секции массива цикл не нужен. Вы должны быть в состоянии написать все значения сразу, используя setValues(). Он ожидает массив в определенной структуре в зависимости от диапазона, в который вы пытаетесь записать. Вы можете увидеть больше здесь: stackoverflow.com/a/69573251/16864869

Brian Gonzalez 26.01.2023 16:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Вместо этого вам нужно взглянуть на использование setValue(), так как он принимает один аргумент типа any.

https://learn.microsoft.com/en-us/javascript/api/office-scripts/excelscript/excelscript.range?view=office-scripts#excelscript-excelscript-range-setvalue-member(1)

Что касается использования переменной для извлечения одной ячейки (или набора ячеек, если на то пошло), вам просто нужно использовать метод getRange(), чтобы сделать это, это базовый пример...

function main(workbook: ExcelScript.Workbook) {
    let cellAddress: string = "A4";
    let range: ExcelScript.Range = workbook.getWorksheet("Data").getRange(cellAddress);
    console.info(range.getAddress());
}

Если вы хотите указать несколько диапазонов, просто измените cellAddress на что-то вроде этого... A4:C10

Этот метод также принимает именованные диапазоны.

Большое вам спасибо, с вашей поправкой я смог заставить это работать.

StillLearning 30.01.2023 09:22

Другие вопросы по теме