从一个电子表格复制/传输到另一代码

时间:2019-06-06 07:37:07

标签: google-apps-script google-sheets

我正在尝试将工作表从一个电子表格复制/传输到另一电子表格。我尝试了各种方法,.copyTo似乎是最好,最有效的方法。

.copyTo运作良好,但我正努力发送至特定的工作表...

这是我的代码:

 function TransferDataOut() {

 var source = SpreadsheetApp.getActiveSpreadsheet();
 var sheetA = source.getSheets()[0]; //sheet source number  

 var destination = SpreadsheetApp.openById('the destination sheet');
 var each = "Data_Incoming"; 

 var ss = SpreadsheetApp.getActiveSpreadsheet();

 sheetA.copyTo(destination); // I tried renaming .setName(each);


 }

因此,如果我仅使用sheetA.copyTo(destination);它只是创建一个复印表,例如the_souce_sheet_name的副本。 如果我尝试重命名以使其具有特定的名称,则第二次运行该工作表已存在于目标电子表格中后,我将收到错误消息。

我真正需要实现的是源电子表格中的功能将数据从源工作表复制到目标电子表格中始终相同的工作表中。 也许.copyTo不是正确的方法? 任何建议和代码都将对您有所帮助!

在目标电子表格中的确切工作表上接收数据的原因是因为我有一个触发器On更改,该触发器执行另一个脚本以处理新的传入数据。

1 个答案:

答案 0 :(得分:1)

  • 您要将电子表格A的源工作表覆盖为电子表格B的目标工作表。
  • 您要保留工作表名称var each = "Data_Incoming"

如果我的理解正确,那么这个答案如何?我想提出2个样本。因此,请根据您的情况选择其中之一。

示例脚本1:

此示例脚本的流程如下。

    电子表格B的
  1. each页已删除。
  2. 电子表格A的源工作表已复制到电子表格B的目标工作表。
  3. 电子表格B的已复制工作表的表名已修改为each

修改后的脚本:

function TransferDataOut() {
  var source = SpreadsheetApp.getActiveSpreadsheet();
  var sheetA = source.getSheets()[0]; //sheet source number
  var destination = SpreadsheetApp.openById('the destination sheet');
  var each = "Data_Incoming"; 
  var destSheet = destination.getSheetByName(each);
  if (destSheet) {
    destination.deleteSheet(destSheet);
  }
  sheetA.copyTo(destination).setName(each);
}

示例脚本2:

此示例脚本的流程如下。

  1. 将电子表格A的源工作表复制到电子表格B。
  2. 如果电子表格B中不存在工作表名称为each的工作表,则复制的工作表将重命名为each

  3. 如果电子表格B中存在工作表名称为each的工作表,则源工作表将以Copy of ###的形式复制到电子表格B。

  4. each工作表已清除。
  5. 已复制工作表的所有值,公式和格式都将复制到each工作表中。
  6. 删除复制的工作表。

修改后的脚本:

function TransferDataOut() {
  var source = SpreadsheetApp.getActiveSpreadsheet();
  var sheetA = source.getSheets()[0]; //sheet source number  
  var destination = SpreadsheetApp.openById('the destination sheet');
  var each = "Data_Incoming";
  var copiedSheet = sheetA.copyTo(destination);
  var destSheet = destination.getSheetByName(each);
  if (destSheet) {
    destSheet.clear();
    var srcRange = copiedSheet.getDataRange();
    srcRange.copyTo(destSheet.getRange(srcRange.getA1Notation()));
    destination.deleteSheet(copiedSheet);
  } else {
    copiedSheet.setName(each);
  }
}

注意:

  • 在此示例脚本中,电子表格B(目标电子表格)的each表被删除。所以请注意这一点。
    • 因此,首先,作为测试,我建议使用示例电子表格。

参考:

如果我误解了您的问题,而这不是您想要的结果,我深表歉意。

已添加:

  • 使用源电子表格中的脚本将源值复制到目标电子表格时,要运行目标电子表格的脚本。

以下示例脚本用于实现上述情况。

目标电子表格脚本:

首先,准备目标电子表格的脚本。

脚本:
function doGet() {

  sample(); // This is the function that you want to run when the source values are copied.

  return ContentService.createTextOutput();
}

将以上脚本复制并粘贴到目标电子表格的脚本编辑器后,请执行以下流程。

  • 部署Web Apps。
    1. 在脚本编辑器上,通过“发布”->“作为Web应用程序部署”打开一个对话框。
    2. 在“将应用程序执行为:”中选择“我”。
    3. 为“谁有权访问该应用程序:”选择“所有人,甚至匿名”。
    4. 单击“部署”按钮作为新的“项目版本”。
    5. 自动打开“需要授权”对话框。
      1. 点击“查看权限”。
      2. 选择自己的帐户。
      3. 在“此应用未验证”中单击“高级”。
      4. 点击“转到###项目名称###(不安全)”
      5. 单击“允许”按钮。
    6. 复制“当前Web应用程序URL:”。
      • 就像https://script.google.com/macros/s/#####/exec
    7. 单击“确定”。

源电子表格的脚本:

下一步,源电子表格的脚本准备如下。在该样品中,使用样品2。我认为您也可以使用示例1。

脚本:
function TransferDataOut() {
  var source = SpreadsheetApp.getActiveSpreadsheet();
  var sheetA = source.getSheets()[0]; //sheet source number  
  var destination = SpreadsheetApp.openById('the destination sheet');
  var each = "Data_Incoming";
  var copiedSheet = sheetA.copyTo(destination);
  var destSheet = destination.getSheetByName(each);
  if (destSheet) {
    destSheet.clear();
    var srcRange = copiedSheet.getDataRange();
    srcRange.copyTo(destSheet.getRange(srcRange.getA1Notation()));
    destination.deleteSheet(copiedSheet);
  } else {
    copiedSheet.setName(each);
  }

  // Added
  var url = "https://script.google.com/macros/s/###/exec"; // Please set the retrieved URL of Web Apps.
  UrlFetchApp.fetch(url);
}

注意:

  • 通过上述设置,当运行源电子表格的TransferDataOut()时,目标电子表格的doGet()UrlFetchApp.fetch(url)运行。

参考文献: