【问题标题】:Have Google Sheet Linked to Google Form Sort By Date Automatically将 Google 表格链接到 Google 表单自动按日期排序
【发布时间】:2019-10-30 10:21:58
【问题描述】:

我使用 Google 表单让人们申请休假。一个名为 Form Approvals 的插件用于向某些可以批准或拒绝请求的人发送电子邮件。在列出响应的 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 } );
  }
}

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

【问题讨论】:

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


    【解决方案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));到函数声明后的第一行。然后通过以适当的方式编辑适当的工作表来运行它,并转到查看日志以查看结果。

    【讨论】:

    • 如果我在脚本编辑器中运行它,我会得到:TypeError: Cannot read property "range" from undefined。 (第 2 行,文件“代码”)我认为这是因为我尝试手动运行它?
    • 另外,新条目没有按此脚本排序:(
    • 您是否将工作表名称添加到脚本中?
    • onEdit() 只响应用户编辑
    • onEdit() 不是这种情况的触发器。你可以试试 onFormSubmit。就我个人而言,我会使用另一张表格并单独留下表格回复表格来处理表格。
    【解决方案2】:
    • 如果您的工作表由表单填充,并且您希望在每次提交新表单时对数据进行排序 - 您需要使用 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 触发器绑定到脚本。

    【讨论】:

      【解决方案3】:

      我使用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/ 并为上述脚本创建触发器。在“选择事件类型”下使用“提交表单”。

      到目前为止效果很好:)

      【讨论】:

        猜你喜欢
        • 2017-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多