Привязать ли лист Google к форме Google? Сортировать по дате автоматически - PullRequest
1 голос
/ 25 октября 2019

Я использую форму Google для людей, чтобы запросить выходные. Надстройка под названием «Подтверждение формы» используется для отправки электронных писем определенным людям, которые могут одобрить или отклонить запрос. В листе Google, где перечислены ответы, новые записи продолжают идти вниз.

Есть ли способ сделать новые записи из формы Google для автоматической сортировки по дате выходного дня в Google Sheet?

Я нашел этот скрипт, но он не работает:

function onEdit(event){
  var sheet = event.source.getActiveSheet();
  var editedCell = sheet.getActiveCell();
  var columnToSortBy = 2;
  var tableRange = sheet.getDataRange();
  if(editedCell.getColumn() == columnToSortBy){   
    var range = sheet.getRange(tableRange);
    range.sort( { column : columnToSortBy } );
  }
}

Кроме того, есть ли способ указать, на какой вкладке листа должен выполняться скрипт?

Ответы [ 3 ]

1 голос
/ 25 октября 2019

Попробуйте:

function onEdit(e){
  var sh=e.range.getSheet();
  if(sh.getName()!="Your desired sheet name")return;
  if(e.range.columnStart==2){   
    sh.getDataRange().sort({ column:2});
  }
}

Многие новые программисты пытаются запустить эти функции onEdit (e) из редактора сценариев. К сожалению, это не работает, поскольку ожидается, что параметр e будет заполнен триггером события. Без объекта события вы, как правило, получаете сообщение об ошибке, например Невозможно прочитать диапазон свойств из неопределенного, поскольку e не был заполнен триггером события.

Я проверяю их, проверяя, что я редактирую правильный лист и исправляюrange, и я использую функцию e.source.toast (), чтобы предоставить мне обратную связь, как в console.log ().

Если вы хотите узнать больше об объекте события, попробуйте добавитьLogger.log (JSON.stringify (е));на первую строку после объявления функции. А затем запустите его, отредактировав соответствующий лист соответствующим образом и перейдите к просмотру журнала, чтобы увидеть результаты.

0 голосов
/ 25 октября 2019

Я понял, используя https://www.idiotinside.com/2018/06/08/sort-multiple-columns-google-sheets-apps-script/:)

Для моей таблицы:

  • Имя листа, который я хочу отсортировать (не каждый лист вэлектронная таблица) называется «Запросы».
  • Даты указаны в столбце B, который является столбцом № 2.
  • Даты сортируются с самыми старыми в верхней части.
  • Обязательно отредактируйтеSHEET_NAME, SORT_DATA_RANGE и SORT_ORDER для ваших нужд.

Используйте этот сценарий с триггером onEdit:

SHEET_NAME = "Requests";
SORT_DATA_RANGE = "A2:L1500";
SORT_ORDER = [
// {column: 1, ascending: true}, // 1 = column number for Column A, sorting by ascending order 
// {column: 3, ascending: false}, // 3 = column number for Column C, sorting by descending order
{column: 2, ascending: true},
];

function onEdit(e){
  multiSortColumns();
}
function multiSortColumns(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName(SHEET_NAME);
  var range = sheet.getRange(SORT_DATA_RANGE);
  range.sort(SORT_ORDER);
  ss.toast('Sorting by Date completed.');
}

Затем перейдите к https://script.google.com/ и создайте триггер дляприведенный выше скрипт. В разделе «Выберите тип события» используйте «При отправке формы».

Пока это работает хорошо:)

0 голосов
/ 25 октября 2019
  • Если ваш лист заполнен формой и вы хотите сортировать данные каждый раз при отправке новой формы - вам нужно использовать триггер onFormSubmit.

  • Google Forms заполняет таблицу назначения в хронологическом порядке, чтобы избежать помех, вы можете использовать таблицу синхронизации, в которую данные передаются при каждой отправке формы и которую вы можете сортировать по своему усмотрению.

Пример:

function myFunction() {
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var sheet=ss.getActiveSheet();
  if(sheet.getName()=="Name of Tab to copy and sort"){
    var lastRow=sheet.getLastRow();
    var lastCol=sheet.getLastColumn();
    var range=sheet.getRange(lastRow,1,1,lastCol);
    var secondarySheetId="XXX";//Paste here the Id of the secondary spreadsheet
    var secondarySheet=SpreadsheetApp.openById(secondarySheetId).getSheetByName("Name of tab of your choice");
    secondarySheet.getRange(secondarySheet.getLastRow()+1,1,1,lastCol).setValues(range.getValues());
    SpreadsheetApp.flush();
    var secondaryRange = secondarySheet.getDataRange();
    var columnToSortBy=2; //adapt to your needs
    secondaryRange.sort( { column : columnToSortBy } );
  }
}

Прикрепите этот скрипт к целевой таблице, вставьте Id вторичной электронной таблицы (которую вы должны создать в первую очередь), сохраните сценарий и привяжите устанавливаемый onFormSubmit триггер для скрипта через Edit->Current project's triggers->New trigger.

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