【问题标题】:Sorting data in Google spreadsheet在 Google 电子表格中对数据进行排序
【发布时间】:2013-07-31 03:48:38
【问题描述】:

我正在使用 Google 表单收集数据,并将其存储在电子表格中。

我想编写一个脚本来创建单独的电子表格,按名称排序。

例如

我有三个用户:DanielGillesJean Pierre

我想从主表创建一个单独的表,只列出提交的数据。

所以,如果第 2 行的名称是 Daniel,我想将行中的所有数据复制到第二张表中

到目前为止:

function tri() 
{
     var ss = SpreadsheetApp.getActiveSpreadsheet();
     var data = ss.getDataRange().getValues();
     var sheet2 = ss.getSheets()[1]; 

     for (var t=1; t<data.length; t++)
     {   
         if (data ='Daniel')
         {   
             sheet2.appendRow([data]);    
         }
     }  
}

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    无需代码,您可以在电子表格中执行此操作。我更喜欢的解决方案是为每个用户创建命名选项卡,将他们的名字放在他们工作表的单元格 A1 中,然后使用电子表格 QUERY 函数来填充他们的工作表。像这样在单元格 A3 中说:

    =query('Form Responses'!A1:Z,"select * where B = '" &A1 & "'")
    

    调整来源以符合您的实际情况 ('Form Responses'!A1:Z)。


    但如果你必须使用脚本,试试这个:

    function tri() 
    {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getSheetByName("Form Responses");
      var data = sheet.getDataRange().getValues();
      var users = ['Daniel', 'Gilles', 'Jean Pierre'];
    
      for (var user=0; user<users.length; user++) {
        // Open sheet with user's name; create if needed
        var dest = ss.getSheetByName(users[user]);
        if (!dest) dest = ss.insertSheet(users[user], user+1);
    
        var newData = [];
        newData.push(data[0]); // copy headers
        for (var row=1; row < data.length; row++) {
          // If row is for this user, copy it
          if (data[row][1] === users[user]) newData.push(data[row]);
        }
        // Clear user's sheet, then save collected data
        dest.clearContents();
        dest.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
      }
    }
    

    【讨论】:

      【解决方案2】:

      作为对 Mogsdad(优秀)答案的补充,我想添加一个可能很重要的细节。

      由于您的用户正在填写表单,您无法确定他们输入姓名的方式,Daniel 会写“Daniel”还是“DANIEL”如果他赶时间,甚至是“daniel”?而对于 "Jean Pierre" 可能会更糟,因为通常 JeanPierre 之间应该有一个连字符!!!

      因此,我建议围绕名称检测添加一些逻辑,或者,如果您确切知道谁将填写此表单,请使用其他可能的解决方案,在您的表单中使用列表选择来选择名称。 这个最新的解决方案当然是最简单的......

      否则你可以简单地使用:

      ...data[row][1].toUpperCase().replace(/ /g,'') == users[user];// users should then be defined in UPPERCASE 
      

      例如为了避免任何大写/小写错误和多余的空格...

      【讨论】:

      • 当然...您可以在选项列表中包含用户名。
      猜你喜欢
      • 2016-09-06
      • 2014-07-31
      • 2023-03-09
      • 1970-01-01
      • 2016-09-11
      • 1970-01-01
      • 1970-01-01
      • 2019-11-27
      • 1970-01-01
      相关资源
      最近更新 更多