将 Google Sheet 链接到 Google 表单自动按日期排序

Have Google Sheet Linked to Google Form Sort By Date Automatically

我使用 Google 表格供人们申请休假。一个名为 Form Approvals 的附加组件用于向某些可以批准或拒绝请求的人发送电子邮件。在 Google Sheet 列出的回复中,新的条目一直排到底部。

有没有办法让 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 } );
  }
}

另外,有没有办法指定脚本 运行 在哪个 sheet 选项卡上?

试试这个:

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 参数预期由事件触发器填充。如果没有事件对象,您通常会收到类似 Cannot read 属性 range from undefined because e has not be populated by the event trigger.

这样的错误

我通过确保编辑正确的 sheet 和正确的范围来测试它们,并且我使用 e.source.toast() 函数为我提供类似于 [=20] 的反馈=]() 确实如此。

如果您想了解有关事件对象的更多信息,请尝试添加 Logger.log(JSON.stringify(e));到函数声明后的第一行。然后通过适当的方式编辑相应的sheet得到运行然后去查看日志查看结果。

  • 如果您的 sheet 由表单填充,并且您想在每次提交新表单时对数据进行排序 - 您需要使用 onFormSubmit 触发器。

  • Google 表格按时间顺序填充目标传播sheet,为了避免干扰,您可以使用同步 sheet 数据传输到每个表单提交,您可以根据需要对其进行排序。

样本:

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 } );
  }
}

将此脚本附加到目标传播sheet,插入辅助传播的 IDsheet(您必须先创建),保存脚本并绑定一个 installable onFormSubmit 通过 Edit->Current project's triggers->New trigger.

触发脚本

我用 https://www.idiotinside.com/2018/06/08/sort-multiple-columns-google-sheets-apps-script/ 弄明白了:)

我的传播sheet:

  • 我要排序的sheet的名字(不是spreadsheet中的每个sheet)叫做"Requests".
  • 日期在 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/ 并为上述脚本创建一个触发器。在 "Select event type" 下使用 "On form submit".

目前为止运行良好:)