使用按钮将数据从表单响应 Sheet 移动到不同的 Sheet

Move Data from Form Response Sheet to Different Sheet using Button

我在“表单响应 Sheet”中有数据。当用户提交保存在“Form Response Sheet”中的表单数据时。当用户在 w 列中标记为 true 并按“提交”按钮时,我想将数据从“表单响应 Sheet”移动到“已验证表单响应”sheet。该行应从“表单响应 sheet”中删除,并应移至已验证表单响应 sheet.

已验证的表单响应 Sheet 包含从表单响应 Sheet 移动的每日数据。移动的数据应该在之前移动的数据之后移动。 Sheet 也与我的团队成员共享。我用的脚本不是运行他

sheet的link如下:

https://docs.google.com/spreadsheets/d/1LUUEZ7sSjBy-WWL3TZt8l6sqtrEBn3dZ03iRDTY1bF0/edit?usp=sharing

我使用的脚本如下:

function copyInfo() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var copySheet = ss.getSheetByName("Form responses 1");
  var pasteSheet = ss.getSheetByName("Verified Form Responses");
  
  var pasteSheet_size=pasteSheet.getRange('A2:A').getValues().filter(String).length;
  var source_size=copySheet.getRange('A2:A').getValues().filter(String).length;
  var source_range = copySheet.getRange(2,1,source_size,copySheet.getLastColumn());

  var move_data = source_range.getValues().filter(row=>row[22]==true);
  var source_data = source_range.getValues().filter(row=>row[22]==false);
  pasteSheet.getRange(pasteSheet_size+1,1,move_data.length,move_data[0].length).setValues(move_data);
  
  source_range.clearContent();
  copySheet.getRange(2,1,source_data.length,source_data[0].length).setValues(source_data);
        
}

问题:

  • 您的目标是在 表单回复 sheet 之间移动数据 另一个 sheet。问题是您需要 删除 之后的行 您从表单回复 sheet 中传输条目,否则您 最终会得到一个响应 sheet full o blank rows on the top (as it is the case right 现在)。
  • 此外,您当前使用的解决方案取决于列的大小 Form responses 1 sheet 中的 A。这意味着如果你有空行 sheet,你会得到错误的行数。

解释/解决方案:

解决方案的第一步是找到列W(复选框列)包含true的索引。为此,您可以使用 reduce():

  const w_vals = src_sh.getRange('W2:W'+src_sh.getLastRow()).getValues().flat();
  const inds = w_vals.reduce(
  (out, bool, index) => bool ? out.concat(index) : out, 
  []
  )

inds 包含要移动到其他 sheet 的行的索引。由于我们从 W2 开始计数,所需的行将由 inds[i]+2.

给出

第二步是迭代inds。在每次迭代中,我们 存储 我们想要移动到 data 数组中的数据,然后我们 删除 该行:

var temp = src_sh.getRange(inds[i]+2,1,1,src_sh.getLastColumn()).getValues().flat();
data.push(temp)
src_sh.deleteRow(inds[i]+2);

请记住,for 循环迭代 向后 ,因为每次我们删除一行时,我们都会更改 sheet 的结构,而 inds 不会'对应正确的行。


最后,我们高效地(使用 setValues复制 data 到目的地 sheet:

dst_sh.getRange(dst_sh_size+1,1,data.length,data[0].length).setValues(data);


片段:

在使用此解决方案之前,删除 Form responses 1 sheet(第 2-108 行)中的所有顶部空行。

function CopyInfo() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const src_sh = ss.getSheetByName("Form responses 1");
  const dst_sh = ss.getSheetByName("Verified Form Responses");
  const dst_sh_size=dst_sh.getRange('A2:A').getValues().filter(String).length;
  
  const w_vals = src_sh.getRange('W2:W'+src_sh.getLastRow()).getValues().flat();
  const inds = w_vals.reduce(
  (out, bool, index) => bool ? out.concat(index) : out, 
  []
  )
   
  const data = [];  
  if ( inds.length != 0) {
  for (let i = inds.length -1 ; i>=0; i--){
  var temp = src_sh.getRange(inds[i]+2,1,1,src_sh.getLastColumn()).getValues().flat();
  data.push(temp)
  src_sh.deleteRow(inds[i]+2);
  }
    
   dst_sh.getRange(dst_sh_size+1,1,data.length,data[0].length).setValues(data);     
  }
}