簡體   English   中英

如何將大量的表單響應表合並到一個主表中。 (Google表格)

[英]How to merge a large number of form response sheets into one master sheet. (Google Sheets)

我有一個電子表格,其中有大量表單(測驗)的表單響應表。 由於所有表格都包含相同的格式,數量和問題順序,因此我想將它們全部收集到一張紙中。

我知道可以使用query({sheet1!range,sheet2!range ...})來完成此操作,但是此查詢的大小非常大(有25種以上的表格!),這需要我弄亂這個公式每次我添加新表格。

我最初研究的是在一個范圍內創建一個工作表列表,然后嘗試使用間接查詢來獲取arrayformula查詢以遍歷該列表。 但是,此操作無效,並在此論壇上詢問后被告知無法完成。

建議我研究腳本,並花了整個周末的時間試圖找到可以做到這一點的腳本。 但是我失敗了。

我需要腳本將表單響應表的最后一行復制到主表的底部。 我希望腳本對所有響應表執行此操作(我為表提供了一種命名格式,該格式可以使腳本輕松查看要合並的表)。 我想我需要使用onSubmit()函數,但不確定。

總覽

我認為使用“提交時觸發”不是一個好主意,因為涉及多種形式和大量響應。 另一方面,如果非常接近地提交多個答復,則可能會產生沖突。 恕我直言,更好的方法是按需(手動)或使用時間驅動的觸發器來運行腳本。

由於Google Apps Script的執行時間不應超過六分鍾1 ,因此我認為最好不要清除母版工作表並立即附加所有工作表響應,而不是檢查每個工作表是否有新的響應。 如果沒有注釋,注釋,自定義格式,數據驗證或數據更改直接應用於母版表,則此方法可行。

腳本

下面是一個腳本,用於將同一電子表格中的表單響應工作表的內容連接到名為“主”的工作表。 我認為,它很容易適應。

假定電子表格僅包含表單響應表和“主”表。

/**
 * Joins the data from form responses sheets on a master responses sheet.
 * Assumes that the master sheet has the form response headers and 
 * that there aren't extra columns.
 */

function joinSheetsData() {
  // Initialize loop variables
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();
  var masterName = 'Master';                             // Change this.
  var masterSheet = ss.getSheetByName(masterName);
  var headers = [masterSheet.getDataRange().getValues()[0]];
  var masterdata = [];

  // Loop to append form responses from all response sheets to one array. 
  for(var i = 0; i < sheets.length; i++){ 
    if(sheets[i].getName() != masterSheet.getName()){
      var data = sheets[i].getDataRange().getValues();
      data.splice(0,1);
      masterdata = append(masterdata,data);
    }
  }
  // Clear the master sheet.
  masterSheet.clear();
  // Add the headers to the master sheet.
  var masterheadersRow = masterSheet.getRange(1, 1, 1,
    masterdata[0].length);
  masterheadersRow.setValues(headers);
  // Send the resulting array to the master sheet.
  var masterdataRange = masterSheet.getRange(2, 1, masterdata.length,
    masterdata[0].length);
  masterdataRange.setValues(masterdata);
}

/*
 * Auxiliary function to append 2D arrays.
 */
function append(a,b){
  for(var i = 0; i<b.length; i++){
    a.push(b[i]);
  }
  return a;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM