javascript - 谷歌表格脚本将完成的行移动到新工作表
问题描述
我有一个脚本,当数据添加到“I”列时,它将数据从一张表移动到另一张表。
我想调整脚本以执行将所有行(值)从列 I 不为空的“未付费”工作表移动到通过按钮按下而不是“编辑”的付费工作表的操作。这将允许一次从多行移动数据,而不是使用一次只移动一行的当前脚本。
请问有人可以帮忙吗?
function onEdit(event) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = event.source.getActiveSheet();
var r = event.source.getActiveRange();
if(s.getName() == "Unpaid" && r.getColumn() == 9 && r.getValue() != "") {
var row = r.getRow();
var numColumns = 11;
var targetSheet = ss.getSheetByName("Paid");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).copyTo((target),{contentsOnly:true});
s.deleteRow(row);
}
else if(s.getName() == "Paid" && r.getColumn() == 14 && r.getValue() == false) {
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Unpaid");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
s.deleteRow(row);
}
}
旁注,脚本的“else if”部分旨在将代码移回原始工作表。这不是必需的,但我无法删除那部分代码并维护功能。
解决方案
解释:
第一步是在工作表中查找I
Unpaid
列不为空的行。为此,您可以将三元运算符应用于I列的每个元素。更详细地说,您可以使用map()函数检查元素是否为空,然后应用filter()仅选择I列中具有非空值的行:const movRows = iVals.map((c,i)=>c!=''?i:null).filter(f=>f!=null);
movRows
包含I不为空的列的索引。要获得实际的行,您需要将2movRows
添加到我们从第二行开始的元素中I2:I
。下一步是遍历
movRows
数组,对于每个元素,删除工作Unpaid
表中的行并将其移动到工作Paid
表中。我们不是直接移动它,而是将数据推送到movData
数组中,然后使用这个数组来传输这些数据以提高效率。迭代需要向后进行,否则每次删除一行时,实际数据和工作表结构之间都会出现不匹配。
要在UI中创建按钮,您可以使用onOpen()触发器。您唯一需要做的就是将以下脚本保存到脚本编辑器中,然后自定义菜单按钮将出现在 UI(电子表格)中。您可以单击该按钮来执行该
transfer()
功能。
解决方案:
function transfer() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const pSh = ss.getSheetByName('Paid');
const upSh = ss.getSheetByName('Unpaid');
const numColumns = 11;
const iVals = upSh.getRange('I2:I'+upSh.getLastRow()).getValues().flat();
const movData = [];
const movRows = iVals.map((c,i)=>c!=''?i:null).filter(f=>f!=null);
movRows.reverse().forEach(row=>{
movData.push(upSh.getRange(row+2,1,1,numColumns).getValues()[0]);
upSh.deleteRow(row+2);
});
pSh.getRange(pSh.getLastRow()+1,1,movData.length,movData[0].length).setValues(movData);
}
并且自定义菜单按钮是使用onOpen
触发器创建的:
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('Macros')
.addItem('Transfer Rows', 'transfer')
.addToUi();
}
推荐阅读
- validation - 验证错误后如何在primefaces中输入输入
- javascript - Mongodb find方法不返回任何内容
- javascript - 将 Javascript 变量传递给 PHP
- haskell - 是否不可能在 Traversable 中获取元素的深度?
- azure - 如何设置 Azure CDN
- angular - Springboot / login 控制器从角度应用程序失败
- time - 是否有将分钟数的十进制值转换为持续时间格式的值的公式?
- java - 找不到控制器 @RequestMapping URL 返回 404
- r - 如何替换字符串中的内部大写字母
- java - map getOrDefault返回对象时如何返回整数