我在电子表格中有两个不同的工作表,两个工作表都包含电子邮件。我正在尝试将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(){
}
}
答案 0 :(得分:1)
我发现很难复制您的代码,因此我只是根据您的问题提出了一个类似的方案,您也可以将其用于您的案例:
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列表中的电子邮件,
如果有匹配项,因为您从4列复制数据,因此将相关数据从y(H:K)复制到x(L:0)。
您可以使用的概念:
您可以使用Google脚本方法:=COUNTIF(A1:A, "<>")
来代替具有计算公式的sheet.getLastRow()
来计算包含内容的最后一行。
最后,pos_found = x_email.indexOf(y_email[i])
给出元素x_email
在列表y_email[i]
中匹配的位置。如果不匹配,则返回-1。