繁体   English   中英

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

[英]Pull data from one Google spreadsheet to another using Google 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];

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

该声明

“这没有做任何事情:”

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

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

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

缺少的只是使用对称语句setValues()将数组写回到工作表

尝试一下,如果出现问题,请立即返回。

编辑:

起初我没有注意到您使用的是getSheetValues而不是getValues (这是因为我从未使用过它)……唯一的区别是getValues是range类的一种方法,而您的属于sheet类 语法在某种程度上相似,只是使用

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

它需要多花一个字,但具有直接等于设定值的优点

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

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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM