[英]Search for matching cells then copy one cell to a different location in Google Sheets
我在電子表格中有兩個不同的工作表,它們都包含電子郵件。 我正在嘗試將 3 個單元格從 email 在工作表“y”上的行移動到相同 email 在工作表“x”上的行。
示例: email 在 D3 的工作表“y”上,同樣的 email 在 F7 的工作表“x”上; 然后我想將單元格從工作表“y”上的 H3:K3(因為 email 在工作表“y”上的第 3 行)復制到工作表“x”上的 L7:P7(因為相同的 email 在工作表上的第 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 列中,
兩張表中的列都有 header,這就是范圍從第二行開始的原因,
檢查 y 列表中的 email 是否與 x 列表中的 email 匹配,
如果存在匹配,則將相關數據從 y(H:K) 復制到 x(L:0),因為您從 4 列復制數據。
您可以使用的概念:
您可以使用 google 腳本方法: sheet.getLastRow()
,而不是使用計數公式=COUNTIF(A1:A, "<>")
來計算最后一行的內容。
最后, pos_found = x_email.indexOf(y_email[i])
給出了列表x_email
中與元素y_email[i]
匹配的元素的 position。 如果沒有匹配,則返回 -1。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.