Как выполнить проверку данных в массиве и применить определенное действие к соответствующим элементам?

Как можно улучшить скрипт, который должен ежедневно в 23:59 проходить по столбцу, находить значение, равное текущей дате, и заменять формулу на соответствующее значение? <br/> <br/> Вот код, который я использовал: <br/> <br/> <pre><code class="javascript">function myFunction() {
  let ss = SpreadsheetApp.getActiveSpreadsheet();
  let Sheet = ss.getSheetByName("Загрузка");
  let Sheet1 = ss.getSheetByName("Воронка");
  
  let findingRange = Sheet.getRange("N:N").getValues();
  let valToFind = Sheet1.getRange("B3").getValue();  // ссылка на ячейку с формулой СЕГОДНЯ()

  let row;
  for(let i = 0; i &lt; findingRange.length; i++){
    if(findingRange[i].indexOf(valToFind) !== -1){
      row = i + 1;
    }
  }console.log(row); // выводит "Информация	undefined"

  Sheet.getRange(row).setValues(Sheet.getRange(row).getValues()); // заменяет формулу в ячейке на ее значение
}</code></pre>
  • 22 февраля 2024 г. 14:38
Ответы на вопрос 2
Для выполнения проверки данных в массиве и применения определенного действия к соответствующим элементам, вы можете использовать метод map(). Например, если вы хотите изменить все элементы массива, удовлетворяющие определенному условию, вы можете сделать это следующим образом:

```javascript
let array = [1, 2, 3, 4, 5];

let newArray = array.map(item => {
  if (item % 2 === 0) {
    return item * 2;
  } else {
    return item;
  }
});

console.log(newArray); // [1, 4, 3, 8, 5] - элементы, удовлетворяющие условию (четные числа) умножены на 2
```

Чтобы улучшить скрипт, который должен ежедневно в 23:59 проходить по столбцу, находить значение, равное текущей дате, и заменять формулу на соответствующее значение, вам следует исправить несколько ошибок в вашем коде:

```javascript
function myFunction() {
  let ss = SpreadsheetApp.getActiveSpreadsheet();
  let Sheet = ss.getSheetByName("Загрузка");
  let Sheet1 = ss.getSheetByName("Воронка");
  
  let findingRange = Sheet.getRange("N:N").getValues();
  let valToFind = Sheet1.getRange("B3").getValue();  // ссылка на ячейку с формулой СЕГОДНЯ()

  let row;
  for(let i = 0; i < findingRange.length; i++){
    if(findingRange[i][0].toISOString() === valToFind.toISOString()){
      row = i + 1;
      break; // Выход из цикла после нахождения первого совпадения
    }
  }
  
  if(row) {
    Sheet.getRange(row, 1).setValue(valToFind); // Заменяет формулу в найденной ячейке на ее значение
  }
}
```

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

function replaceFormula() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("Загрузка");
  const currentDate = Utilities.formatDate(new Date(), "GMT+3", "dd.MM.yyyy"); // текущая дата
  const range = sheet.getRange(1,1,sheet.getLastRow(),1).getValues();  // тут сейчас диапазон A:A. Диапазон N:N getRange(1,14,sheet.getLastRow(),1)
   
  for(let i = 0; i < range.length; i++) {
    let today = Utilities.formatDate(new Date(range[i]), "GMT+3", "dd.MM.yyyy") == currentDate;
    if(today){      
      sheet.getRange(i+1,1).setValue(currentDate);  // для диапазона N:N sheet.getRange(i+1,14)
    }
  };  
}
Похожие вопросы