Задать вопрос
@tytroman

Как добавить в список по алфавиту строку?

При заполнении гугл формы появляется новое имя, которое нужно вставить в список по алфавиту. Усложняется это всё тем, что нужно это делать через строчку.
1.Первая строчка(а)
2.Пустая строчка
3. Вторая строчка(б)
4. Пустая строчка
5. Третья строчка(в)
И.т.д
62cad1f630bd6983485226.jpeg
  • Вопрос задан
  • 42 просмотра
Подписаться 1 Простой 4 комментария
Решения вопроса 1
oshliaer
@oshliaer Куратор тега Google Apps Script
Google Products Expert
Решение с примером тут https://t.me/google_spreadsheets_chat/251090

function formSendAction() {
  const book = SpreadsheetApp.openById('1EbRQ1yV0upNFW11fuyfl3Bts7OTJ9rSAN2kiBekhzRg');
  const data = book.getSheetByName('Лист2').getDataRange()
    .getValues().slice(1)
    .map(row => row[1])
    .sort(stringCompare_)
    .reverse();
  const target = book.getSheetByName('Результат');
  const targetData = target.getDataRange()
    .getValues()
    .map(row => row[0]);
  const targetDataR = [...targetData].reverse();
  const firstIndexR = targetDataR.findIndex(fioTarget => fioTarget !== '');
  const firstIndex = targetData.findIndex(fioTarget => fioTarget !== '');
  const lastIndexR = targetDataR.length - firstIndex;
  data.forEach(fio => {
    if (!targetData.includes(fio)) {
      let index = targetDataR.findIndex(fioTarget => fioTarget !== '' && stringCompare_(fioTarget, fio) === -1);
      if (index === -1) {
        console.log(stringCompare_(targetData[firstIndex], fio), firstIndex, targetData[firstIndex], fio);
        if (stringCompare_(targetData[firstIndex], fio) === 1) {
          index = lastIndexR + 1;
        } else {
          index = firstIndexR - 2;
        }
      };
      index = targetDataR.length - index + 2;
      target.insertRowsBefore(index, 2);
      target.getRange(index, 1).setValue(fio);
      target.setRowHeights(index + 1, 1, 10);
    }
  });
}

function stringCompare_(a, b) {
  return String(a).toLocaleLowerCase() < String(b).toLocaleLowerCase() ? -1 :
    String(a).toLocaleLowerCase() > String(b).toLocaleLowerCase() ? 1 : 0;
};
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
ProgrammerForever
@ProgrammerForever Куратор тега Google Apps Script
Учитель, автоэлектрик, программист, музыкант
Зачем молотить на месте? Сделайте отдельный лист, где можно сделать с данными всё что захочется.
Если вы хотите писать данные, относящиеся к строке с данными из формы в следующей строке - это плохая идея.
Хорошее правило для данных в таблицах: 1 строка = 1 запись
И ещё одно правило: не смешивать статические данные (те, что дописываются руками) и динамические(те, что выводятся формулой или скриптом, сортируются, фильтруются и т.п.).
Судя по вопросу, тут оба этих правила нарушаются. С этим можно жить, но это сложно для реализации, трудноподдерживаемо, и гарантированно сломается.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы