Как переименовать новый лист Google, используя ссылки на ячейки?

#javascript #arrays #google-apps-script #data-science

Вопрос:

Поэтому в настоящее время я пытаюсь создать скрипт Google, который экспортирует отдельные таблицы Google для каждого уникального имени пользователя, т. Е. Пытается создать настраиваемый отчет для каждого клиента. В принципе, у меня есть список уникальных имен пользователей-список под названием uniqueUserName-и я хочу установить имя нового листа на «Имя», соответствующее имени пользователя. Например, предположим, что Sally1 находится в следующей таблице. Код будет выполнять поиск по именам пользователей (с циклом for), и, как только цикл for попадет в Sally1, код вернет Салли Уолл, т. Е. имя, соответствующее ее имени пользователя. Тогда Салли Уолл будет новым названием документа.

Имя пользователя Имя
Тимми Тим Джонс
Вылазка1 Салли Уолл
кошачья жизнь Джон Мюллер
готов2учиться Синди Родни

Я попробовал следующий код:

 newSheet.setName(function(uniqueName, values){
   for (var i=0; i < values.length; i  ) {
      if (values[i][0].Username === uniqueName) {
         return values[i][1].Name;
         break;
      }
   }
});
 

(Я включаю функцию разрыва, потому что, если чье-то имя появляется дважды, я не хочу копировать его имя дважды. )

Как бы мне пришлось корректировать этот код для достижения этих целей? Это на правильном пути?

Честно говоря, я уже некоторое время изучаю этот код, просматривая, насколько могу, на stack overflow, YouTube, так что я очень ценю вашу помощь!

Комментарии:

1. Просто для уточнения, когда вы сказали «скрипт Google, который экспортирует отдельные листы Google для каждого уникального имени пользователя», вы имеете в виду, что используете метод makeCopy() для экспорта отдельных копий файла google sheet с уникальными именами файлов на основе имен пользователей? Можете ли вы также поделиться полным кодом, чтобы убедиться, что мы знаем всю логику и уменьшить любые предположения с нашей стороны?

2. Значения и уникальное имя не определены или, по крайней мере, мы не знаем, откуда они берутся, и ваш код фактически не задает имя листа, поэтому нам, вероятно, нужно просмотреть код, вызывающий эту функцию, чтобы понять, чего вы пытаетесь достичь

Ответ №1:

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

Другое дело , что вы пытаетесь получить доступ к свойствам Name и Username элементам в values , но, предполагая, что вы получили values от getValues (), эти свойства не существуют. Вы можете получить нужные вам значения, просто используя индексы, как вы уже делаете: values[i][0] и values[i][1] .

Кроме того, вам не нужно использовать break , потому что цикл все равно будет прерван return оператором.

Учитывая вышесказанное и предполагая, что есть лист под названием Имена (с именами, которые вы опубликовали) и другой шаблон отчета под названием, вы можете изменить свой код на что-то вроде:

 function newNamedSheetTest() {
  const uniqueName = 'Sally1';
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const values = spreadsheet.getSheetByName('Names').getDataRange().getValues();
  const newSheet = spreadsheet.getSheetByName('Report Template').copyTo(spreadsheet);

  newSheet.setName(function (uniqueName, values) {
    for (let i = 0; i < values.length; i  ) {
      if (values[i][0] === uniqueName) {
        return values[i][1];
      }
    }
  }(uniqueName, values));
}
 

Другим вариантом было бы использовать фильтр и карту, чтобы получить название листа:

 function newNamedSheetTestShort() {
  const uniqueName = 'Sally1';
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const values = spreadsheet.getSheetByName('Names').getDataRange().getValues();
  const newSheetName = values.filter(row => row[0] === uniqueName).map(row => row[1]);
  const newSheet = spreadsheet.getSheetByName('Report Template').copyTo(spreadsheet);
  newSheet.setName(newSheetName);
}