使用按钮将数据从表单响应 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);
}
}
我在“表单响应 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);
}
}