根据匹配值将数据复制到另一个工作表

时间:2012-11-13 02:55:05

标签: google-apps-script google-sheets

这与我上一个问题略有不同,但我无法将代码转移到此。

工作表1具有公司名称的个人联系人。每个人都有一个名字,但公司名称可能会根据表格中有多少人显示多次。所以:

Name        Company       Work Address
John Smith  ABC Company
Jim Smith   XYZ Company
Bob Smith   ABC Company

表2的公司的工作地址为:

Company        Work Address
ABC Company    1234 Street, USA
XYZ Company    5678 Street, USA

如何编写脚本以便公司地址转到单个联系表?

我尝试过使用数组,并搜索行/列索引,但我遗漏了一些东西。这段代码让我最接近,但不能使它工作(代码列和行号与样本不匹配,它们只是我正在尝试的当前数组,fyi):

function populateCofieldsincontact() {
  var writeSheet = sskey.getSheetByName('POCs');
  var sourceSheet = sskey.getSheetByName('Businesses');

  var writeData = writeSheet.getRange(1, 6, writeSheet.getLastRow(), 5).getValues();Logger.log(writeData)
  for (var w = 0; w < writeData.length; w++ ) {

    var sourceData = sourceSheet.getRange(1, 2, sourceSheet.getLastRow(), 3).getValues();
    var dest = [];
    for (var i = 0; i < sourceData.length; i++ ) {
      if (writeData ==sourceData[i][0].toString().match(writeData)) {
        dest.push(sourceData[i][2]); 
      }
    }
  }
  if (dest.length > 0 ) {
      writeSheet.getRange(2,10,dest.length,1).setValue(dest.toString());
    }
}

任何帮助都非常感谢!

快速更新 - 我能够获得setValue(不是因某些原因无法工作的setValues)并在正确的列中写入地址,但只有我认为让它在循环中写入才能使用getLastRow ,我只知道如何为表格做到这一点。所以我最终将所有地址放在正确的列中,但是从实际数据所在的底部开始写入。我无法弄清楚如何让它写入顶行,然后向下,呃。

最终(希望如此)代码:我在@ Adam代码的第13行第二次提到[w][0]旁边插入writeData,它似乎在几个测试。谢谢@Adam和@Serge !!:

function populateCofieldsincontact() {
  var writeSheet = sskey.getSheetByName('POCs');
  var sourceSheet = sskey.getSheetByName('Businesses');

  var writeData = writeSheet.getRange(2, 6, writeSheet.getLastRow() - 1).getValues();
  var sourceData = sourceSheet.getRange(2, 2, sourceSheet.getLastRow(), 12).getValues();
  var dest = [];
  var temp;

  for (var w = 0; w < writeData.length; w++) {
    temp = null;
    for (var i = 0; i < sourceData.length; i++) {
      if (writeData[w][0] == sourceData[i][0].toString().match(writeData[w][0])) {
        temp = sourceData[i][11];
        break;
      }
    }
    dest.push([temp]);
  }
  if (dest.length > 0 ) {
      writeSheet.getRange(2, 13, dest.length, 1).setValues(dest);  Logger.log(dest)
  }
}

2 个答案:

答案 0 :(得分:4)

看看这是否按预期工作,希望我的假设是正确的(编辑:根据评论纠正错误)

function populateCofieldsincontact() {
  var writeSheet = sskey.getSheetByName('POCs');
  var sourceSheet = sskey.getSheetByName('Businesses');

  var writeData = writeSheet.getRange(2, 6, writeSheet.getLastRow() - 1).getValues();
  var sourceData = sourceSheet.getRange(1, 2, sourceSheet.getLastRow(), 3).getValues();
  var dest = [];
  var temp;

  for (var w = 0; w < writeData.length; w++) {
    temp = null;
    for (var i = 0; i < sourceData.length; i++) {
      if (writeData[w][0] == sourceData[i][0].toString().match(writeData[w][0])) {
        temp = sourceData[i][2];
        break;
      }
    }
    dest.push([temp]);
  }
  if (dest.length > 0 ) {
      writeSheet.getRange(2, 10, dest.length, 1).setValues(dest);
  }
}

我想你的代码存在一些问题,但我认为重要的信息(这对于像我这样的人来说很合适)是当你使用getValues和setValues时,你总是在处理2-维数组,即使数组只有一列宽。因此dest.push([temp])位中的方括号 - 实际上是逐步将长度为1的数组推入到dest数组中。

答案 1 :(得分:0)

你应该使用两个循环并在第一个循环的每个步骤中迭代第二个循环。 如果在第二个循环中找不到匹配项,那么您应该在第一个数组中推送一个空项以保持数据在第一个数据表中对齐。 我相信你可以通过这个......