谷歌表格脚本帮助在表格之间移动数据
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 而不是一月