Заменить дубликаты нулевым значением в Google Script - PullRequest
1 голос
/ 19 июня 2020

У меня есть список имен папок, соответствующих именам файлов в каждой из этих папок.

enter image description here

Я хочу удалить повторяющиеся имена папок. Это то, что мне нужно, чтобы в итоге получилось:

enter image description here

Я думал, что сделаю обратное l oop, сравнивая каждую запись с один перед этим. Если он совпадает, добавьте пробел '' в начало массива. Если он не совпадает, добавьте значение записи массива в начало массива.

Ниже моя попытка. Почему-то все сравнения ложны. Что я делаю не так?

  //Delete Duplicate folder names
  var destRange = summarySht.getRange(startRow + 1,2,detLastRN - startRow,1);
  //var folderNamesArr = destRange.getValues();
  var folderNamesArr = [['Folder1'],['Folder1'],['Folder2'],['Folder2'],['Folder3'],['Folder4'],['Folder5'],['Folder6'],['Folder6']];
  var updatedFolderNamesArr = [];
  for (i = folderNamesArr.length - 1; i >= 0; i--) {
    if(folderNamesArr[i] != folderNamesArr[i - 1]){
      updatedFolderNamesArr.unshift(folderNamesArr[i])
    }else{
      updatedFolderNamesArr.unshift([''])
    }
    Logger.log(folderNamesArr[i] + ' vs ' + folderNamesArr[i - 1] + ' = ' + (folderNamesArr[i] === folderNamesArr[i - 1]))
  }
  Logger.log(updatedFolderNamesArr)
  destRange.clearContent();
  destRange.setValues(updatedFolderNamesArr);

У меня мало строк. Я думаю, что в худшем случае у нас будет 100, может быть, 200 строк для обработки.

Обновление: Я добавил .toString(), и, похоже, он работает. Вот что я сделал и мои проблемы с этим.

  //Delete Duplicate folder names
  var destRange = summarySht.getRange(startRow + 1,2,detLastRN - startRow,1);
  //var folderNamesArr = destRange.getValues();
  var folderNamesArr = [['Folder1'],['Folder1'],['Folder2'],['Folder2'],['Folder3'],['Folder4'],['Folder5'],['Folder6'],['Folder6']];
  var updatedFolderNamesArr = [];
  for (i = folderNamesArr.length - 1; i >= 1; i--) {
    if(folderNamesArr[i].toString() !== folderNamesArr[i - 1].toString()){
      updatedFolderNamesArr.unshift(folderNamesArr[i])
    }else{
      updatedFolderNamesArr.unshift([''])
    }
    Logger.log(folderNamesArr[i] + ' vs ' + folderNamesArr[i - 1] + ' = ' + (folderNamesArr[i] === folderNamesArr[i - 1]))
  }
  //Add back the first folder
  updatedFolderNamesArr.unshift(folderNamesArr[0]);      
  Logger.log(updatedFolderNamesArr)
  destRange.clearContent();
  destRange.setValues(updatedFolderNamesArr);

Первая проблема, с которой я столкнулся, заключалась в том, что folderNamesArr[i - 1] не работает, когда доходит до последнего элемента. Поэтому мне пришлось изменить ограничение на l oop на i >= 1. Это привело к тому, что на 1 элемент меньше. Первый элемент отсутствовал, поэтому мне пришлось добавить его обратно в конец.

Мне это кажется хакерским. Это приемлемо или есть способы / методы получше?

1 Ответ

2 голосов
/ 19 июня 2020

Как насчет этого ответа?

Точки модификации:

  • В вашем скрипте folderNamesArr - это двухмерный массив, который извлекается с помощью getValue. Но на if(folderNamesArr[i] != folderNamesArr[i - 1]){ массивы сравниваются. Таким образом, этот оператор if всегда равен true. Таким образом, updatedFolderNamesArr становится таким же, как folderNamesArr.
    • Кроме того, я думаю, что причина того, что if(folderNamesArr[i].toString() !== folderNamesArr[i - 1].toString()){ работает, заключается в следующем.
    • Но когда if(folderNamesArr[i] != folderNamesArr[i - 1]){ изменяется на if(folderNamesArr[i][0] != folderNamesArr[i - 1][0]){, когда i равно 0, возникает ошибка.
    • Итак, необходимо изменить for (i = folderNamesArr.length - 1; i >= 0; i--) { на for (i = folderNamesArr.length - 1; i > 0; i--) {.
    • Но в этом случае из-за (i = folderNamesArr.length - 1; i > 0; i--) результат будет [[""],["Folder2"],[""],["Folder3"],["Folder4"],["Folder5"],["Folder6"],[""]]. 1-й элемент не включен. В этом потоке, когда i равно 1, ставится folderNamesArr[i].

Когда ваш скрипт изменен, как насчет следующей модификации?

Измененный скрипт:

var folderNamesArr = [['Folder1'],['Folder1'],['Folder2'],['Folder2'],['Folder3'],['Folder4'],['Folder5'],['Folder6'],['Folder6']];
var updatedFolderNamesArr = [];
for (i = folderNamesArr.length - 1; i > 0; i--) {  // Modified
  if (folderNamesArr[i][0] != folderNamesArr[i - 1][0]) {  // Modified
    updatedFolderNamesArr.unshift(folderNamesArr[i]);
  } else {
    updatedFolderNamesArr.unshift(['']);
  }
  if (i == 1) updatedFolderNamesArr.unshift(folderNamesArr[i]);  // Added
}
Logger.log(updatedFolderNamesArr)

Другой образец:

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

var folderNamesArr = [['Folder1'],['Folder1'],['Folder2'],['Folder2'],['Folder3'],['Folder4'],['Folder5'],['Folder6'],['Folder6']];
var updatedFolderNamesArr = folderNamesArr
  .flat()
  .reduce((ar, e) => ar.concat(ar.includes(e) ? '' : e), [])
  .map(e => [e]);
Logger.log(updatedFolderNamesArr)

Ссылка:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...