Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用按钮将数据从表单响应表移动到不同的表_Javascript_Google Apps Script_Google Forms - Fatal编程技术网

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

Javascript 使用按钮将数据从表单响应表移动到不同的表,javascript,google-apps-script,google-forms,Javascript,Google Apps Script,Google Forms,我在“表格回复表”中有数据。当用户提交保存在“表单响应表”中的表单数据时。当用户在w列中标记为true并按下“提交”按钮时,我想将数据从“表单响应表”移动到“已验证表单响应”表。应从“表格响应表”中删除该行,并将其移至已验证的表格响应表 已验证的表单响应表包含从表单响应表中移动的每日数据。移动的数据应在先前移动的数据之后移动。该表也与我的团队成员共享。我用的剧本不是他写的 该表的链接如下所示: function copyInfo() { var ss = SpreadsheetApp.get

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

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

该表的链接如下所示:

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);
        
}

我使用的脚本如下所示:

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);
        
}

问题:
  • 您的目标是将表单响应之间的数据移动到 另一张。问题是您需要删除后面的行 您可以从表单响应表中转移条目,否则 最终会在顶部出现一个满o行空白的响应表(如右图所示) 现在)
  • 此外,当前使用的解决方案取决于列的大小 A在
    表格回复1
    表格中。也就是说,如果在 那张纸,你会得到错误的行数

解释/解决方案: 解决方案的第一步是找到列W(复选框列)包含true的索引。要实现这一点,您可以使用:

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


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

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循环向后迭代,因为每次删除一行时,我们都会更改工作表的结构,
inds
不会对应正确的行


最后,我们高效地(使用
setValues
数据
复制到目标表:

dst_sh.getRange(dst_sh_size+1,1,data.length,data[0].length).设置值(data)


片段: 使用此解决方案之前,删除
表单响应1
表(第2-108行)中所有顶部空行


你能说明你在哪一点被卡住了吗?您当前的问题是什么?脚本正在与我合作。但其他团队成员正在使用此工作表,请单击“提交”按钮。当他单击按钮时,脚本不会运行。它需要授权。请建议。@Admin RKPareekCo其他用户是否具有表单的编辑权限?例如,他可以手动删除一行吗?如果是,请确保其他用户已授予代表其执行脚本的权限。@Admin RKPareekCo脚本没有问题。其他用户必须向脚本授予权限,就像每个用户需要对每个脚本所做的那样。你只需要给他编辑权限。如果用户允许访问脚本,请立即告诉我。我已通过“编辑器”权限授予他访问权限。@Admin RKPareekCo确保您没有对该用户隐藏工作表,或者您没有对工作表应用保护。用户可能具有编辑权限,但工作表可能受到保护或隐藏,因此用户无法编辑。但无论如何,如果这也不起作用,恐怕没有人能在这个职位上帮助你。你能就这个问题发表一个不同的问题吗?既然我的回答解决了你原来的问题,请接受它,如果你愿意,请投票:)
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);     
  }
}