将多行复制并粘贴到另一个 sheet 上的下一个空行
Copying and Paste multiple rows into next empty Row on another sheet
我有以下脚本:
function onEdit(event) {
// assumes source data in sheet named Needed
// target sheet of move to named Acquired
// test column with yes/no is col 5 or E
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = event.source.getActiveSheet();
var r = event.source.getActiveRange();
if(s.getName() == "IN" && r.getColumn() == 7 && r.getValue() == "Y") {
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("ORDERS");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).copyTo(target);
}
}
这是我在其中找到脚本的原始 post:
https://support.google.com/docs/forum/AAAABuH1jm0hR40qh02UWE/?hl=en&gpf=%23!topic%2Fdocs%2FhR40qh02UWE
我想对代码做一些小的调整,但不知道从哪里开始。
目前,当 "Y" 被输入到 G 列时,它会复制整行并将行内容放在 ORDERS! 的最后一行。
我想要它做的是:
1) 仅复制订单最后一行的 B、C 和 E 列!
2) 删除 IN! 上 E 和 F 中的值!在代码对该特定行具有 运行 之后(不希望它删除我没有放置 "Y" 的行)
3) 有没有一种方法可以改为使用按钮,当单击该按钮时,它会立即复制带有 "Y" 的所有行?
这里是 link 我的 sheet 如果你想玩的话:
https://docs.google.com/spreadsheets/d/1Peo5_5QmkxVyL7j5bmgtMs9BL16cvsGhhOSuRV_TsAo/edit?usp=sharing
此致
曼克
我相信你的目标如下。
- 当"G"列为
Y
时,您想将"B"、"C"和"E"列的值复制到最后一行的 sheet ORDERS
。
- 当脚本为 运行.
时,您想复制列 "G" 为 Y
的所有行
- 您想删除
IN
的 sheet 中复制行的 "E" 和 "F" 列的内容,当脚本是 运行.
- 您想通过单击 sheet 上的按钮来 运行 脚本。
为此,这个答案怎么样?
修改点:
- 在你的脚本中,
- 当脚本是 运行 通过点击 sheet 上的按钮时,无法使用事件对象。
- 您的脚本复制活动范围的一行。
- 复制行的 "E" 和 "F" 列未删除。
需要修改以上修改点。当以上几点反映到脚本中,就变成了下面的样子。
修改后的脚本:
请将以下脚本复制并粘贴到脚本编辑器中。请准备一个正在绘制and/or图像的按钮,并将函数run
分配给该按钮。这样,当按钮被点击时,脚本是运行。并且 "G" 列 Y
的所有行的 "B"、"C" 和 "E" 列是从 sheet "IN" 到 sheet "ORDERS".
的最后一行
function run() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var srcSheet = ss.getSheetByName("IN");
var dstSheet = ss.getSheetByName("ORDERS");
// 1. Retrieve the values from "A2:G" of sheet "IN".
var srcValues = srcSheet.getRange("A2:G" + srcSheet.getLastRow()).getValues();
// 2. Create an object for putting values and deleting the contents of the columns "E" and "F".
var obj = srcValues.reduce((o, [,b,c,,e,,g], i) => {
if (g == "Y") {
o.values.push([b, c, e]);
o.ranges.push(`E${i + 2}:F${i + 2}`);
}
return o;
}, {values: [], ranges: []});
// 3. Copy the values to the sheet "ORDERS".
dstSheet.getRange(dstSheet.getLastRow() + 1, 1, obj.values.length, obj.values[0].length).setValues(obj.values);
// 4. Delete the contents of the columns "E" and "F" of sheet "IN".
srcSheet.getRangeList(obj.ranges).clearContent();
}
注:
- 关于 运行 宁 Google Apps 脚本的按钮,我认为这个网站很有用。 Ref 在您的情况下,请在 sheet "IN" 上创建一个按钮并将函数
run
分配给该按钮。这样,当单击按钮时,脚本就会运行。
- 请在 V8 中使用此脚本。
参考文献:
我有以下脚本:
function onEdit(event) {
// assumes source data in sheet named Needed
// target sheet of move to named Acquired
// test column with yes/no is col 5 or E
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = event.source.getActiveSheet();
var r = event.source.getActiveRange();
if(s.getName() == "IN" && r.getColumn() == 7 && r.getValue() == "Y") {
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("ORDERS");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).copyTo(target);
}
}
这是我在其中找到脚本的原始 post: https://support.google.com/docs/forum/AAAABuH1jm0hR40qh02UWE/?hl=en&gpf=%23!topic%2Fdocs%2FhR40qh02UWE
我想对代码做一些小的调整,但不知道从哪里开始。
目前,当 "Y" 被输入到 G 列时,它会复制整行并将行内容放在 ORDERS! 的最后一行。
我想要它做的是:
1) 仅复制订单最后一行的 B、C 和 E 列! 2) 删除 IN! 上 E 和 F 中的值!在代码对该特定行具有 运行 之后(不希望它删除我没有放置 "Y" 的行) 3) 有没有一种方法可以改为使用按钮,当单击该按钮时,它会立即复制带有 "Y" 的所有行?
这里是 link 我的 sheet 如果你想玩的话: https://docs.google.com/spreadsheets/d/1Peo5_5QmkxVyL7j5bmgtMs9BL16cvsGhhOSuRV_TsAo/edit?usp=sharing
此致 曼克
我相信你的目标如下。
- 当"G"列为
Y
时,您想将"B"、"C"和"E"列的值复制到最后一行的 sheetORDERS
。- 当脚本为 运行. 时,您想复制列 "G" 为
Y
的所有行 - 您想删除
IN
的 sheet 中复制行的 "E" 和 "F" 列的内容,当脚本是 运行. - 您想通过单击 sheet 上的按钮来 运行 脚本。
为此,这个答案怎么样?
修改点:
- 在你的脚本中,
- 当脚本是 运行 通过点击 sheet 上的按钮时,无法使用事件对象。
- 您的脚本复制活动范围的一行。
- 复制行的 "E" 和 "F" 列未删除。
需要修改以上修改点。当以上几点反映到脚本中,就变成了下面的样子。
修改后的脚本:
请将以下脚本复制并粘贴到脚本编辑器中。请准备一个正在绘制and/or图像的按钮,并将函数run
分配给该按钮。这样,当按钮被点击时,脚本是运行。并且 "G" 列 Y
的所有行的 "B"、"C" 和 "E" 列是从 sheet "IN" 到 sheet "ORDERS".
function run() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var srcSheet = ss.getSheetByName("IN");
var dstSheet = ss.getSheetByName("ORDERS");
// 1. Retrieve the values from "A2:G" of sheet "IN".
var srcValues = srcSheet.getRange("A2:G" + srcSheet.getLastRow()).getValues();
// 2. Create an object for putting values and deleting the contents of the columns "E" and "F".
var obj = srcValues.reduce((o, [,b,c,,e,,g], i) => {
if (g == "Y") {
o.values.push([b, c, e]);
o.ranges.push(`E${i + 2}:F${i + 2}`);
}
return o;
}, {values: [], ranges: []});
// 3. Copy the values to the sheet "ORDERS".
dstSheet.getRange(dstSheet.getLastRow() + 1, 1, obj.values.length, obj.values[0].length).setValues(obj.values);
// 4. Delete the contents of the columns "E" and "F" of sheet "IN".
srcSheet.getRangeList(obj.ranges).clearContent();
}
注:
- 关于 运行 宁 Google Apps 脚本的按钮,我认为这个网站很有用。 Ref 在您的情况下,请在 sheet "IN" 上创建一个按钮并将函数
run
分配给该按钮。这样,当单击按钮时,脚本就会运行。 - 请在 V8 中使用此脚本。