【问题标题】:Sorting data in a sheet with added information Google Sheets使用附加信息对工作表中的数据进行排序 Google 表格
【发布时间】:2021-09-21 10:45:17
【问题描述】:

我的工作有一个谷歌表单,其中输入了不同的信息。然后,所有这些信息都会自动放入 Google 表格中。我们将其称为“所有数据表”。 “所有数据表”中有多张表,一张包含所有数据,然后一张用于需要提供给不同人员的每种类型的数据。其中之一称为“看守人”。

然后我有第二个 Google 表格(名为“排序”的示例),它将“管理员”表格中的所有内容都拉到“导入范围”。

这使管理员可以看到所有需要修复的东西,最旧的东西在顶部,最新的东西在底部。

管理员希望最新的位于顶部。 我可以轻松地制作另一张使用排序功能将最新的放在顶部的工作表(请参阅“已排序”)。

但是,他还想要另一列,他可以在其中选中一个框以显示它已完成或写一个 x。

出现新数据时,复选框不会下移。

有没有办法对数据进行排序,但也有一个输入列与排序的数据保持一致?

Link to example.

【问题讨论】:

    标签: google-sheets


    【解决方案1】:

    您必须使用 Google Apps 脚本。

    试试这个:

    1. 首先,转到工具并点击脚本编辑器
    2. 删除Code.gs中的代码
    3. 粘贴下面提供的代码并保存
    4. 刷新您的电子表格,自定义菜单将在菜单中弹出
    5. 转到自定义菜单并点击更新排序表

    首次执行需要用户授权。授权脚本后,请确保重新运行自定义菜单。

    下面的代码将在您的电子表格中创建一个自定义菜单。单击自定义菜单将执行一个函数,该函数将更新排序表并保留其复选框值。

    我还加了cmets来解释代码中每一行的作用。

    代码:

    function updateSorted() {
    
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sh = ss.getSheetByName("Import_range");
      var sortedSh = ss.getSheetByName("Sorted");
    
      /* Use this if the Import_range is from different spreadsheet
      var iSS = SpreadsheetApp.openById("Insert Sheet ID here");
      var sh = iSS.getSheetByName("Insert Sheet name here");
      and comment the var sh = ss.getSheetByName("Import_range"); above*/
      
      /*
      Check if the Sorted Sheet has data. 
      If true, compare Sorted Sheet and Import_range data
      else, copy Import_range data to Sorted Sheet. 
      */
      if(sortedSh.getLastRow() > 1){ 
        
        var sData = sortedSh.getRange(2, 1, sortedSh.getLastRow()-1, 5).getValues(); //remove unnecessary data
        var sDataFiltered = sData.filter(e => e[4]); //get Date column of Sorted sheet
        var sDates = sortedSh.getRange(2, 5, sortedSh.getLastRow()-1, 1).getValues().flat(); 
        var sDatesFiltered = sDates.filter((a) => a); //remove unnecessary data
        
        
        var importDates = sh.getRange(2, 4, sh.getLastRow()-1, 1).getValues().flat(); //get Date column of Import_range
        
        //convert dates to String format
        var arr1 = sDatesFiltered.map( dateString => String(dateString))
        var arr2 = importDates.map( dateString => String(dateString))
      
        var difference = arr2.filter(x => !arr1.includes(x)); //get the difference between arr1 and arr2
        difference.forEach(dates => {
          
          var index = arr2.indexOf(dates); //get new entry position in Import_range
          var newEntry = sh.getRange(index+2, 1, 1, 4).getValues().flat(); //get row data of new entry from Import_range
          newEntry.unshift(false); //append false in the beggining of the array
          sDataFiltered.push(newEntry); //append new entry to sDataFiltered array
        })
    
        var range = sortedSh.getRange(2, 1, sDataFiltered.length, 5);
        range.setValues(sDataFiltered); //set the values of Sorted sheet using the sDataFiltered array as data
        sortedSh.getRange(2, 1, sDataFiltered.length, 1).insertCheckboxes(); //get the checkbox range and insert checkbox
        range.sort({column: 5, ascending: false}); //sort the data by Date column
    
      }else{
        var range = sh.getRange(2, 1, sh.getLastRow()-1, 4);
        var data = range.getValues();
        data.forEach(row => {
          row.unshift(false)
        })
        var sortedRange = sortedSh.getRange(2, 1, data.length, 5);
        sortedRange.setValues(data);
        sortedSh.getRange(2, 1, data.length, 1).insertCheckboxes();
        sortedRange.sort({column: 5, ascending: false});
      }
    }
    
    function onOpen() {
      var ui = SpreadsheetApp.getUi();
      ui.createMenu('Custom Menu')
          .addItem('Update Sorted Sheet', 'updateSorted')
          .addToUi();
    }
    

    示例:

    填充空排序表:

    更新 Import_range 工作表,单击复选框并更新 Sorted Sheet:

    实现时间驱动触发器:

    1. 打开您的 Apps 脚本项目。
    2. 点击左侧的触发警报。
    3. 点击右下角的添加触发器。
    4. 选择并配置您要创建的触发器类型。
    5. 点击保存。

    对于时间驱动,您的触发器设置应如下所示:

    上面的示例触发器将每分钟更新一次工作表。使用时间驱动触发器的缺点是配额限制。 Gmail 帐户的总运行时间限制为 90 分钟。超出配额将导致错误。见Quotas for Google Services


    使用按钮:自定义菜单的替代方案

    在您的工作表中创建一个用户友好的按钮

    1. 转到插入 -> 绘图
    2. 绘制所需的按钮形状和样式。
    3. 点击保存并关闭
    4. 将按钮移至所需位置
    5. 右键单击,单击三个垂直点并选择分配脚本
    6. 输入 updateSorted 并点击 确定
    7. 点击按钮运行

    注意:如果您决定使用按钮并想删除工作表中的自定义菜单,只需删除您的 Apps 脚本中的 onOpen 函数即可。

    参考资料:

    【讨论】:

    • 这太棒了。谢谢你。有没有办法让它自动更新,还是我需要点击“更新排序表”按钮?收到此消息的人说他不是计算机人,我可能很难说服他他需要按下按钮才能使用。
    • @tierratheseeress - 要使其自动化,您可以使用时间驱动的可安装触发器。这将在给定时间更新工作表。我在上面添加了一个示例,它将每分钟更新一次工作表。使用时间驱动触发器的缺点是 gmail 帐户每天的总运行时间限制为 90 分钟。您必须调整间隔以避免错误。这导致我使用按钮或自定义菜单。我还在上面的答案中添加了按钮示例。这比自定义菜单更加用户友好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多