用于复制和排序表单提交数据的脚本

时间:2013-01-28 19:35:14

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

我正在使用Google表单创建一个我希望按日期戳Z-A自动排序的电子表格。只要有人填写表格,就会触发排序。

我认为这样做的方法是:

  1. 询问电子表格中是否有“表单回复副本”...
    • 如果是,请清除所有内容......
    • 否则...
  2. 将电子表格复制到“表单回复副本”......
  3. 根据时间戳排序
  4. 以下是我到目前为止拼凑的内容。它仅在第一次记录响应时起作用。我不是编码员,所以任何帮助都表示赞赏。如果有人也可以指出我的基本语法命令列表,我将不胜感激。

    function CopySheet() {
        var ss = SpreadsheetApp.getActiveSpreadsheet();
        var msheet = ss.getSheetByName("Form Responses"); 
        msheet.copyTo(ss);
    
        var CopySheet = ss.getSheetByName("Copy of Form Responses"); 
        CopySheet.sort(1,   false); // here 1 is for column no. 1 that 
                   // is "Column A" and true is for ascending, make it 
                   // false if you want descending.
    };
    

1 个答案:

答案 0 :(得分:1)

您可以在没有脚本的情况下通过在副本表中使用QUERY()来完成此操作。例如,如果您将此函数放在副本工作表的单元格A1中,并将该代码替换为表单响应电子表格,则最终会得到反向时间戳排序的响应副本:

=Query(ImportRange(spreadsheet_key,"Form Responses!A:Z"), "select * order by Col1 desc")

此数据将定期刷新(约5分钟),因此它将反映新表单提交,但不是实时的。

注意:使用ImportRange()作为Query的源数据时,需要使用ColN表示法引用查询字符串中的列。

或者,您可以在接收表单提交的电子表格中生成表单提交触发器功能,并将已排序的表单响应复制到您的副本表。以下功能可以做到这一点。您需要将其设置为电子表格表单提交事件的触发器功能。有关如何测试此类功能的信息,请参阅How can I test a trigger function in GAS?

function copyFormSubmissions(e) {
  var sourceSheet = e.range.getSheet();
  var data = sourceSheet.getDataRange().getValues();
  var headers = data.splice(0,1)[0]; // remove headers from data
  data.sort(reverseTimestampOrder);  // Sort 2d array
  data.splice(0,0,headers);          // replace headers

  var destId = "--copy-sheet-ID--";
  var destSheet = SpreadsheetApp.openById(destId).getSheetByName('Sheet1');
  destSheet.clear();
  destSheet.getRange(1,1,data.length,data[0].length).setValues(data);
};

function reverseTimestampOrder(a,b) {
  // Timestamp is in first (zero-th) column
  return (b[0]-a[0]);
}
  

如果有人也可以指出我的基本语法命令列表,我将不胜感激。

Google Apps脚本API类和方法参考是here。如果您正在学习,请尝试教程(相同的地方),我建议您通过某种形式的电子学习熟悉Javascript - CodeAcademy.com是一个很好的起点,因为它引入了所有的语言结构,而没有关注网页开发,使其与Googls Apps Script非常相关。