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

时间:2019-10-24 23:17:19

标签: sorting google-apps-script google-sheets google-form

我使用Google表格让人们请假。名为“表单批准”的加载项用于向某些可以批准或拒绝请求的人发送电子邮件。在列出响应的Google表格中,新条目一直位于底部。

是否可以通过Google表格中的休假日期自动对Google表单中的新条目进行排序?

我找到了这个脚本,但是它不起作用:

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 个答案:

答案 0 :(得分:1)

尝试一下:

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。

我通过确保编辑正确的图纸和正确的范围来测试它们,并使用e.source.toast()函数为我提供类似于console.log()的反馈。

如果您想了解有关事件对象的更多信息,请尝试添加Logger.log(JSON.stringify(e));。到函数声明后的第一行。然后以适当的方式编辑适当的工作表并使其运行,然后查看日志以查看结果。

答案 1 :(得分:0)

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

  • Google表单按时间顺序填充了目标电子表格,为避免发生干扰,您可以使用同步表,每次提交表单时将数据传输到该同步表,并可以根据需要进行排序。

示例:

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,保存脚本并通过Edit->Current project's triggers->New triggerinstallable onFormSubmit触发器绑定到脚本。

答案 2 :(得分:0)

我使用https://www.idiotinside.com/2018/06/08/sort-multiple-columns-google-sheets-apps-script/知道了:)

对于我的电子表格:

  • 我要排序的工作表(不是电子表格中的每个工作表)的名称称为“请求”。
  • 日期在第2列的B列中。
  • 日期排在最前,排在最前。
  • 请确保根据需要编辑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/并为上述脚本创建触发器。在“选择事件类型”下,使用“在表单上提交”。

目前为止效果很好:)