javascript - 搜索匹配的单元格,然后将一个单元格复制到 Google 表格中的其他位置
问题描述
我在电子表格中有两个不同的工作表,它们都包含电子邮件。我正在尝试将 3 个单元格从工作表“y”中电子邮件所在的行移动到工作表“x”中同一电子邮件所在的行。
示例: 一封电子邮件在 D3 的工作表“y”上,同一电子邮件在 F7 的工作表“x”上;然后我想将单元格从工作表“y”上的 H3:K3(因为电子邮件在工作表“y”的第 3 行)复制到工作表“x”上的 L7:P7(因为同一电子邮件在工作表的第 7 行“X”)。
另外,我在工作表“x”上的 R2 和工作表“y”上的 N2 中有这个公式,以告诉其中有数据的最后一行是什么,因此脚本只扫描匹配的电子邮件直到该行。我有变量“finalRowV”和“maxEmail”分别引用这些单元格:
=COUNTIF(A1:A, "<>")
我不是最擅长 JavaScript,但我觉得我编译了一个连贯的脚本(对我来说......)但是当我运行它时什么也没发生:没有错误但数据没有移动。
function onOpen(e){
function runIt(){
var mainSheet = SpreadsheetApp.getActiveSpreadsheet();
var workoutSheet = mainSheet.getSheetByName("x");
var customerSheet = mainSheet.getSheetByName("y");
var searchRow = 2;
var searchLoc = "C" + searchRow;
var copyLoc = "D" + searchRow + ":F" + searchRow;
var maxEmail = customerSheet.getRange("N2").getValue();
var found = 0;
if (searchRow > maxEmail){
if(found = 0){
Logger.log("No match found");
}
else{
endSearch();
}
}
var finalRowV = workoutSheet.getRange("R2").getValue();
var targetColumnV = "C2:C" + finalRowV;
var targetColumn = workoutSheet.getRange(targetColumnV).getValues();
var email = customerSheet.getRange(searchLoc).getValue();
for (var i = 2; i < targetColumn[2].length; i++){
if (targetColumn["C"][i].toString() == email.toString()){
Logger.log("found the email " + targetColumn["C"][i] + " at cell" + searchRow + i);
found++;
searchRow++;
var pasteLoc = "M" + i + ":O" + i;
customerSheet.getRange(copyLoc).copyTo(workoutSheet.getRange(pasteLoc));
runIt();
}
else {
customerSheet.getRange(searchLoc).setBackground("red");
i++;
searchRow++;
runIt();
}
}
}
function endSearch(){
}
}
解决方案
我发现很难重现您的代码,因此我只是根据您的问题制作了一个类似的场景,您也可以将其用于您的案例:
function moveEmails() {
ss = SpreadsheetApp.getActive();
sx = ss.getSheetByName("x");
sy = ss.getSheetByName("y");
sx_size = sx.getLastRow();
sy_size = sy.getLastRow();
x_email = sx.getRange("F2:F"+sx_size).getValues().flat([1]);
y_email = sy.getRange("D2:D"+sy_size).getValues().flat([1]);
for (var i = 0 ; i < y_email.length ; i++ ) {
pos_found = x_email.indexOf(y_email[i]);
if (pos_found > -1) {
y_data = sy.getRange("H"+(i+2)+":K"+(i+2)).getValues();
sx.getRange("L"+(pos_found+2)+":O"+(pos_found+2)).setValues(y_data);
}
}
}
解释:
我有两张纸: x,y ,
x 中的电子邮件在 F 列中,y 中的电子邮件在 D 列中,
两张表中的列都有一个标题,这就是范围从第二行开始的原因,
检查来自 y 列表的电子邮件是否与来自 x 列表的电子邮件匹配,
如果存在匹配,则将相关数据从 y(H:K) 复制到 x(L:0),因为您从 4 列复制数据。
您可以使用的概念:
您可以使用谷歌脚本方法,而不是使用计数公式=COUNTIF(A1:A, "<>")
来计算最后一行的内容:sheet.getLastRow()
.
最后,pos_found = x_email.indexOf(y_email[i])
给出该元素在列表x_email
中y_email[i]
匹配的元素的位置。如果没有匹配,则返回 -1。
推荐阅读
- javascript - 如何模块化使用constructor.prototype的javascript函数?
- mysql - 在 wordpress 中显示 mysql 字符串输出
- html - 移动导航栏切换器未出现在 500 像素的最大宽度中
- javascript - 如果列标题发生冲突,希望在 html 表上动态设置最小宽度
- excel - 如何在 Office JS Excel-Add-In 的自定义函数中请求具有令牌授权的数据?
- c# - SQL Server Express“'system.data.entity.internal.appconfig'的类型初始化程序引发异常”错误
- azure-data-explorer - CslCommandGenerator.GenerateTableCreateMergeCommand 中的错误
- python - 腌制一个用于多处理 python args= 的自定义类
- android - 我该如何解决颤振路径提供程序调试错误
- php - 如果客户购买了特定产品,请禁用 WooCommerce 产品一段时间