2

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

表 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

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

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

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)
  }
}
4

2 回答 2

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 时,您总是在处理二维数组,即使数组只有一列宽。因此,位中的方括号dest.push([temp])- 您实际上是在逐步将长度为 1 的数组推入 dest 数组。

于 2012-11-13T06:10:34.257 回答
0

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

于 2012-11-13T05:57:52.123 回答