使用Google脚本将数据从一个Google电子表格拉到另一个

时间:2014-02-04 21:21:34

标签: javascript google-apps-script

我的云端硬盘中有2个电子表格。我想从1个电子表格中的单元格中提取数据并将其复制到另一个电子表格中。 电子表格“TestUsage”有时会在A列中有数据,但没有一列是B列。 我想这样,当我打开电子表格时,它会从表单“TestParts”填充表单“TestUsage”中的空单元格。 这是我的代码:

var ssTestUsage = SpreadsheetApp.getActiveSpreadsheet();
var sTestUsage = ssTestUsage.getActiveSheet();
var lastRowTestUsage = sTestUsage.getLastRow();
var rangeTestUsage = sTestUsage.getSheetValues(1, 1, lastRowTestUsage, 4);
var TESTPARTS_ID = "1NjaFo0Y_MR2uvwit1WuNeRfc7JCOyukaKZhuraWNmKo";
var ssTestParts = SpreadsheetApp.openById(TESTPARTS_ID);
var sTestParts = ssTestParts.getSheets()[0];
var lastRowTestParts = sTestParts.getLastRow();
var rangeTestParts = sTestParts.getSheetValues(1, 1, lastRowTestParts, 3);

function onOpen() {
  for (i = 2; i < lastRowTestUsage; i++) {
    if (rangeTestUsage[i][0] !== "" && rangeTestUsage[i][1] == "") {
      for (j = 1; j < lastRowTestParts; j++) {
        if (rangeTestUsage[i][0] == rangeTestParts[j][0]) {
          Logger.log(rangeTestUsage[i][1]);
          Logger.log(rangeTestParts[j][1]);
          rangeTestUsage[i][1] = rangeTestParts[j][1];
          break;
        }
      }
    }
  }
}

这个问题是这没有做任何事情:

rangeTestUsage[i][1] = rangeTestParts[j][1];

我知道必须有一种方法可以将数据从一个范围获取到另一个范围。 如果我完全错误或者我走在正确的道路上,请告诉我。

2 个答案:

答案 0 :(得分:1)

声明

“这没有做任何事情:”

rangeTestUsage[i][1] = rangeTestParts[j][2];

不是真的......而且也不是真的假......实际上它确实将值赋给rangeTestUsage i,但你没有看到它,因为它没有反映在电子表格中。

这两个值都是使用getValues从Sheet中获取的,所以那时它们都是数组元素。

缺少的是使用对称语句setValues()

将数组写回到工作表

尝试一下,如果出现问题,请不要犹豫回来。

编辑:

我一开始并没有注意到您使用的是getSheetValues而不是getValues(仅仅因为我从未使用过这个)...唯一的区别是getValues是{的方法{3}}虽然您属于range class;语法在某种程度上是相似的,只需使用

即可
Sheet.getRange(row,col,width,height).getValues()

它需要多一个字,但有一个优势就是直接等同于设定值

Sheet.getRange(row,col,width,height).setValues()

答案 1 :(得分:0)

Serge insas对您的代码无效的原因有很好的解释,并提示下面的解决方案。

我建议你使用数组存储你想要的B列的更新值,然后在最后设置整个列。

修改代码......

var ssTestUsage = SpreadsheetApp.getActiveSpreadsheet();
var sTestUsage = ssTestUsage.getActiveSheet();
var lastRowTestUsage = sTestUsage.getLastRow();
var rangeTestUsage = sTestUsage.getSheetValues(1, 1, lastRowTestUsage, 2);
var TESTPARTS_ID = "1NjaFo0Y_MR2uvwit1WuNeRfc7JCOyukaKZhuraWNmKo";
var ssTestParts = SpreadsheetApp.openById(TESTPARTS_ID);
var sTestParts = ssTestParts.getSheets()[0];
var lastRowTestParts = sTestParts.getLastRow();
var rangeTestParts = sTestParts.getSheetValues(1, 1, lastRowTestParts, 2);

var colB = [];

function onOpen() {
  for (i = 2; i < lastRowTestUsage; i++) {
    if (rangeTestUsage[i][0] !== "" && rangeTestUsage[i][1] == "") {
      var matched = false;
      for (j = 1; j < lastRowTestParts; j++) {
        if (rangeTestUsage[i][0] == rangeTestParts[j][0]) {
          //Logger.log(rangeTestUsage[i][1]);
          //Logger.log(rangeTestParts[j][1]);
          colB.push([rangeTestParts[j][1]]); // push the value we want into colB array
          matched = true;
          break;
        }
      }
      if(!matched) // this is in case you don't have a match
        colB.push([""]); // incase we don't have a matching part
    } else {
      colB.push([rangeTestUsage[i][0]]); // we already have a value we want so just add that to colB array
    }
  }
  sTestUsage.getRange(2,2,lastRowTestUsage).setValues(colB); // update entire column b with values in colB array
}