在特定范围内将工作表的新值插入到另一个工作表

时间:2020-07-19 15:27:32

标签: google-apps-script google-sheets

假设我有两张纸(sourceSheet和targetSheet)。我正在寻找一个非常简单的脚本,可以在其中进行操作:

1-从每个要比较的工作表中指定两个范围(例如sourceSheet->范围B2:B100和targetSheet->范围E3:E)

2-比较指定范围内的值

3-当sourceSheet范围中的值在targetSheet范围中不存在时,请将其附加到targetSheet中指定范围的第一个空单元格中(以示例E3:E为例)。请注意,该脚本无法编辑该范围(E3:E)中的任何现有值,而只能附加新值。

虽然这听起来很简单,但我一直在尝试各种选项和功能,但均未成功。所以我想也许有人已经有这样的东西了?

2 个答案:

答案 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);
  }
}