假设我有两张纸(sourceSheet和targetSheet)。我正在寻找一个非常简单的脚本,可以在其中进行操作:
1-从每个要比较的工作表中指定两个范围(例如sourceSheet->范围B2:B100和targetSheet->范围E3:E)
2-比较指定范围内的值
3-当sourceSheet范围中的值在targetSheet范围中不存在时,请将其附加到targetSheet中指定范围的第一个空单元格中(以示例E3:E为例)。请注意,该脚本无法编辑该范围(E3:E)中的任何现有值,而只能附加新值。
虽然这听起来很简单,但我一直在尝试各种选项和功能,但均未成功。所以我想也许有人已经有这样的东西了?
答案 0 :(得分:0)
我想我知道了。我敢肯定,有更好的方法可以做到这一点。但这是我的功能,任何人都可以按照指定的方式重复使用更改位:
function updateSheet() {
// imput the source and target sheets and the ranges where to operate, including headers!
var source_sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("source_sheet_name");
var target_sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("target_sheet_name");
var inputSourceRange = "range_to_review e.g. A2:A"
var inputTargetRange = "range_to_review e.g. A9:A"
// get the source range, the column number and starting row number
var sourceRange = source_sheet.getRange(inputSourceRange + source_sheet.getLastRow());
var sourceColumn = sourceRange.getColumn();
var sourceRow = sourceRange.getRow();
// get the target range, the column number, the starting row number and the last used row
var Avals = target_sheet.getRange(inputTargetRange).getValues();
var Alast = Avals.filter(String).length;
var targetRange = target_sheet.getRange(inputTargetRange + Alast);
var test = target_sheet.getLastRow()
var targetColumn = targetRange.getColumn();
var targetRow = targetRange.getRow();
var last_row = targetRange.getLastRow();
//get the values for the srouce range and the target range
var source_data = sourceRange.getValues();
var target_data = targetRange.getValues();
//compare ranges and append new non existing values in target sheet
var resultArray = [];
for ( var n = 0 ; n < source_data.length ; n++) {
var keep = true;
for(var p in target_data) {
if (source_data[n][0] == target_data[p][0]) {
keep = false;
break;
}
}
var columnsToKeep = [0];
var tempData = [];
if(keep){
for(var c in columnsToKeep){ tempData.push(source_data[n][columnsToKeep[c]])}
resultArray.push(tempData);
}
}
last_row++;
resultArray = resultArray.filter(String);
if(resultArray.length>0){
target_sheet.getRange(last_row,targetColumn,resultArray.length,resultArray[0].length).setValues(resultArray);
}
}
答案 1 :(得分:0)
我认为这符合您的要求:
function appendMissingValues() {
const ss=SpreadsheetApp.getActive();
const ssh=ss.getSheetByName('Sheet1');
const srg=ssh.getRange('A2:A10');
const svs=srg.getValues().map(function(r){return r[0];});
const tsh=ss.getSheetByName('Sheet2');
const trg=tsh.getRange(2,2,tsh.getLastRow(),1);
const tvs=trg.getValues().map(function(r){return r[0];});
let oA=[];
svs.forEach(function(e,i){
//if next line is true then e is not in tvs
if(tvs.indexOf(e)==-1) {
oA.push([e]);//making a column here
}
});
tsh.getRange(tsh.getLastRow()+1,2,oA.length,1).setValues(oA);//Load all output at one time
}
这是我的工作表1列A中的数据
Col1
10
11
12
13
14
15
16
17
18
这是我在columnB中的sheet2数据
,Col2
,1
,2
,3
,4
,5
,6
,7
,8
,9
这是运行功能后的第二页:
,Col2
,1
,2
,3
,4
,5
,6
,7
,8
,9
,10
,11
,12
,13
,14
,15
,16
,17
,18
我相信除了确定开始的行和列之外,这涵盖了所有内容,并且我需要进行其他解释才能了解所需的内容。
function appendMissingValues() {
const ss=SpreadsheetApp.getActive();
const ssh=ss.getSheetByName('Sheet1');
const srg=ssh.getRange('A2:A10');
const svs=srg.getValues().map(function(r){return r[0];});
const tsh=ss.getSheetByName('Sheet2');
const tshsr=2;
let oA=[];
if((tsh.getLastRow()-tshsr)>0) {
const trg=tsh.getRange(tshsr,2,tsh.getLastRow(),1);
const tvs=trg.getValues().map(function(r){return r[0];});
svs.forEach(function(e,i){
if(tvs.indexOf(e)==-1) {
oA.push([e]);
}
});
tsh.getRange(tsh.getLastRow()+1,2,oA.length,1).setValues(oA);
}else{
svs.forEach(function(e){oA.push([e]);})
tsh.getRange(tshsr,2,oA.length,1).setValues(oA);
}
}