![](/img/trans.png)
[英]How to change the background color in Google Apps Script when looping over more than one condition and using two arrays as inputs?
[英]Can't copy more than one value when comparing two columns in two sheets for differences in Google Apps Script
我正在使用Google Apps腳本創建一個腳本,該腳本可以在包含唯一ID的特定列中逐行比較電子表格中的兩個工作表。 如果Sheet(1)中的A [i]與Sheet(2)中的A [i]不同,我希望將具有該單元格的整行復制到新工作表中。 床單真的很大,幾千行。
到目前為止,當腳本復制一次值然后繼續循環而沒有進一步的結果時,我已經達到了一個目的。 此外,它需要很長時間,我懷疑這可能是非常次優的。 我在Google Apps腳本中進行調試非常困難,而且我很有智慧。 這是我到目前為止所做的和我的評論。
function compareSheetDrop(input) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
//create a new blank sheet where the output will be stored
ss.insertSheet(5);
/*create references to sheets used by the script.
dropSheet is the sheet used as a basis,
compareSheet is a sheet possibly containing new values,
resultSheet is the blank sheet that will store new values
*/
var dropSheet = ss.getSheetByName("Drop (2)");
var compareSheet = ss.getSheets()[4];
var resultSheet = ss.getSheets()[5];
/*loop over the entire dropSheet and look for differences.
The sheets have header rows*/
for (var i = 2; i <= dropSheet.getLastRow(); i++) {
/*variable j will represent the row number
where the difference will be pasted to
resultsSheet.A[j] etc.*/
var j = 1;
/*establish references to the cells
that will be used for comparison
(i.e. A[i] in dropSheet, A[i] in compareRange)*/
var dropRange = dropSheet.getRange(i, 1);
var compareRange = compareSheet.getRange(i, 1);
/*establish references to the row
that will be copied from compareSheet
and to the row that
will be the destination in resultsSheet*/
var resultRange = resultSheet.getRange(j, 1);
var entireRow = compareSheet.getRange(i, 1);
/*check if the unique value of
cell dropSheet.A[i] is different from
compareSheet.A[i] and whether they are not blanks.
If they are different,
copy entire row from compareSheet to the resultsSheet*/
if (dropRange.getValues()[0] !== compareRange.getValues()[0] && dropSheet.getRange(i, 1).isBlank() == false && compareSheet.getRange(i, 1).isBlank() == false) {
j++;
entireRow.copyTo(resultRange, SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
}
}
}
我希望resultSheets在compareSheet中沒有dropSheet中存在的行,但是在一行中我得到一個單元格A1填充,然后在腳本仍在運行時沒有任何反應。 我懷疑問題可能在循環本身和copyTo中,但我找不到原因。
如果只比較每個工作表的第一列,則可以使用getSheetValues(startRow, startColumn, numRows, numColumns)
方法獲取值,而無需相互檢查每個單元格。 當你拿到床單時,你應該得到這樣的:
var dropSheet = ss.getSheetByName("Drop (2)").getSheetValues(1,1,x,1);
var compareSheet = ss.getSheets()[4].getSheetValues(1,1,x,1);
其中x
是每張紙上的行數。 這樣可以獲得工作表中所有值的兩個數組。 迭代這些來檢查不同的行應該更容易,然后你可以使用你找到它們的索引來獲取resultSheet
中行的范圍來編輯它並插入你想要的行。
這個問題就如何獲得行的范圍有一個很好的例子: Google腳本選擇Google電子表格中的整行
如果對方法有任何疑問,請鏈接到電子表格文檔: https : //developers.google.com/apps-script/reference/spreadsheet/spreadsheet#getsheets
嘗試這個:
function copyRowWhenAsDontMatch() {
var ss=SpreadsheetApp.getActive();
var sh1=ss.getSheetByName('Sheet1');
var rg1=sh1.getRange(2,1,sh1.getLastRow()-1,sh1.getLastColumn());
var vA1=rg1.getValues();
var sh2=ss.getSheetByName('Sheet2');
var rg2=sh2.getRange(2,1,sh2.getLastRow()-1,sh2.getLastColumn());
var vA2=rg2.getValues();
var sh3=ss.getSheetByName('Sheet3');//rows that dont match in sheet1
sh3.clear();
var sh4=ss.getSheetByName('Sheet4');//rows that dont match in sheet2
sh4.clear();
for(var i=0;i<vA1.length;i++) {
if(vA1[i][0]!=vA2[i][0]) {
sh3.appendRow(vA1[i]);
sh4.appendRow(vA2[i]);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.