谷歌表格脚本帮助在表格之间移动数据

Posted

技术标签:

【中文标题】谷歌表格脚本帮助在表格之间移动数据【英文标题】:Google Sheets script help moving data between sheets 【发布时间】:2020-06-22 21:26:13 【问题描述】:

我正在将一个列表加载到谷歌工作表选项卡 SheetA 中,然后将数据单元格逐个修改到不同选项卡 SheetB 中的同一个谷歌工作表中,并在处理过程中进行一些操作。

但我知道如何做到这一点的唯一方法是每次都激活工作表,而且它真的很慢。有没有办法移动数据而无需物理激活工作表。因此,例如在不停用 SheetB 的情况下从 SheetA 中获取单元格 A1 的值?

这是代码部分的示例,您可以在其中看到它来回激活工作表。我曾经在 Excel 中执行过类似的功能,但在 Excel 中我不必激活工作表,并且可以在运行时关闭视觉效果,这使得整个传输速度非常快。

你能在谷歌表格中做同样的事情吗?如果是,语法是什么?

   while (SpreadsheetApp.getActiveSheet().getRange('A'+ COUNTERSheetA).getValue() != "")
     VALUEA = SpreadsheetApp.getActiveSheet().getRange('A'+ COUNTERSheetA).getValue()
     VALUEB = SpreadsheetApp.getActiveSheet().getRange('B'+ COUNTERA).getValue()
     spreadsheet.setActiveSheet(spreadsheet.getSheetByName('SheetA'), true);
     spreadsheet.getRange('A'+COUNTERSheetB).activate();
     spreadsheet.getCurrentCell().setValue(VALUEA);
     spreadsheet.getRange('B'+COUNTERSheetB).activate();
     spreadsheet.getCurrentCell().setValue(VALUEB);
     COUNTERSheetB = COUNTERSheetB + 1
     COUNTERSheetA = COUNTERSheetA + 1
     spreadsheet.setActiveSheet(spreadsheet.getSheetByName('SheetA'), true);
   

【问题讨论】:

现在您可以对任何问题/答案进行投票。欢迎来到*** 【参考方案1】:
function myfunc() 
  const ss=SpreadsheetApp.getActive();
  const shA=ss.getSheetByName('SheetA');//gets SheetA by name
  const rgA=shA.getDataRange();//gets all of the data in the sheet
  var vA=rgA.getValues();//gets all the data at one time as one two dimensional array of data
  vA.forEach(function(r,i)
    r.forEach(function(c,j)
      vA[i][j]=(WhateverYouWanttoDoToEachCell);
    );
  );
  const shB=ss.getSheetByName('SheetB');//gets SheetB by name
  const rgB=shB.getRange(1,1,vA.length,vA[0].length).setValues(vA);//1,1 is A1 but you could choose the upper left corner to be anywhere.  Loads all of the data at one time.
  //If you're going to be doing something with those spreadsheet values immediately you may wish to employ SpreadsheetApp.flush() to guarantee that all of the values have been loaded into the spreadsheet.
  SpreadsheetApp.flush();

Array.forEach() method

Spreadsheet Reference

【讨论】:

非常感谢,我迫不及待想明天试试这个。【参考方案2】:

你当然可以。您可以简单地将每个工作表声明为变量,然后使用工作表类进行调用。下面的例子。 考虑到每次使用 getRange() 方法都会对运行时产生负担。 更好的方法是一次将所有值放入一个二维数组,然后遍历该数组,转换为一个新的二维数组,然后将该二维数组写入另一张表。

function myFunction() 
 let COUNTERSheetA = 1;
 let COUNTERSheetB = 1;
 let VALUEA;
 let VALUEB;
 const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
 const sheetA = spreadsheet.getSheetByName('SheetA');
 const sheetB = spreadsheet.getSheetByName('SheetB');
 
  while (sheetA.getRange('A'+ COUNTERSheetA).getValue() != "") 
  VALUEA = sheetA.getRange('A'+ COUNTERSheetA).getValue() 
  VALUEB = sheetA.getRange('B'+ COUNTERSheetA).getValue() 
  sheetB.getRange('A'+COUNTERSheetB).setValue(VALUEA); 
  sheetB.getRange('B'+COUNTERSheetB).setValue(VALUEB);
  COUNTERSheetB = COUNTERSheetB + 1 
  COUNTERSheetA = COUNTERSheetA + 1 
  

如果您想使用它,这是实际的工作表: https://docs.google.com/spreadsheets/d/1Gev2KxpX5mPik92Io3eOeF3nKngVcKxnWiNktlHxdDI/edit?usp=sharing

这是一个提取所有值、迭代它们,然后将它们插入新工作表的示例。如果你能在这里弄清楚你需要的逻辑,这是迄今为止最快的方法。

function myFunction() 
 let VALUES;
 const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
 const sheetA = spreadsheet.getSheetByName('SheetA');
 const sheetB = spreadsheet.getSheetByName('SheetB');
 
  VALUES = sheetA.getRange(1, 1,sheetA.getLastRow(), 2).getValues();
  
  for (let row of VALUES)
    for (let val of row)
    //Do your manipulations here if you can.
      Logger.log(val);
    
  
  sheetB.getRange(1, 1,sheetA.getLastRow(), 2).setValues(VALUES);

这是上面代码的工作表: https://docs.google.com/spreadsheets/d/1Gev2KxpX5mPik92Io3eOeF3nKngVcKxnWiNktlHxdDI/edit?usp=sharing

【讨论】:

非常感谢您提供的代码示例

以上是关于谷歌表格脚本帮助在表格之间移动数据的主要内容,如果未能解决你的问题,请参考以下文章

谷歌表格应用脚本 toLocaleString 返回 M01 而不是一月

谷歌表格公式获取冒号之间的文本

谷歌表格查询,分组和两个日期之间的透视

用于将数据从谷歌电子表格加载到 bigquery 的独立脚本

谷歌表格脚本返回#NAME?

将一个谷歌驱动器文件夹中的所有照片插入谷歌表格?