【问题标题】:is there a way to copy a specific tab with all its formatting over to a specific tab of another spreadsheet?有没有办法将具有所有格式的特定选项卡复制到另一个电子表格的特定选项卡?
【发布时间】:2022-02-23 00:21:14
【问题描述】:

在这里需要一些帮助。 我有一个有几个标签的主谷歌表。它们中的大多数都包含私人信息,所以我必须将一个供公众查看的标签(sourcetab)导入另一个电子表格,以便我可以在谷歌网站上分享它。

我尝试过 importrange,但它只将值复制到另一个电子表格的目标选项卡。

问题 1:源选项卡有几个链接、图像和格式,我在目标上需要它。 问题 2:我的管理层将更新主源选项卡,并希望目标也能自动更新,并附上所有格式和链接。 我知道谷歌应用脚​​本可能会有所帮助。

因此,需要帮助来建议如何将源选项卡复制到目标选项卡并在主选项卡发生更改时对其进行更新。

[1][尝试过copytab,但它只在源中创建一个新标签,并且在主标签中有任何编辑时不会自动更新]

function copyTab() {
  var ss, sourceSheet, sourceData, sourceDataRange, newSheetTab;

  ss = SpreadsheetApp.getActiveSpreadsheet();//Get active spreadsheet

  sourceSheet = ss.getSheetByName("Sample: Restriction Updates");//Get the source sheet tab
  newSheetTab = ss.insertSheet("newsheet");//Create a new sheet tab

  sourceDataRange = sourceSheet.getDataRange();

  sourceDataRange.copyTo(newSheetTab.getRange(1, 1));//Copies the data from a range of 
  //cells to another range of cells. By default both the values and formatting are copied

}

[2][尝试创建到目的地但失败]

function myFunction() {
  var source = SpreadsheetApp.openById('sourceID');
  var sourceSheet = source.getSheetByName('Sample: Restriction Updates');
  var sourceRange = sourceSheet.getDataRange();
  var sourceValues = sourceRange.getValues();

  var tempSheet = source.getSheetByName('temp');
  var tempRange = tempSheet.getRange('A1');

  var destinationsheet = SpreadsheetApp.openById('DestinationID');
  var destination = source.getSheetByName('Test');

  sourceRange.copyTo(tempRange);  // paste all formats?, broken references
  tempRange.offset(0, 0, sourceValues.length, sourceValues[0].length)
  .setValues(sourceValues);  // paste all values (over broken refs)

  tempSheet.copyTo(destination);  // now copy temp sheet to another ss
}

【问题讨论】:

  • 欢迎来到 SO。请问您为什么决定将代码粘贴为图像而不是文本?
  • 哎呀。对不起。这里很新。让我把它贴在这里。

标签: google-apps-script google-sheets google-sheets-formula


【解决方案1】:

如果我正确理解您的问题,您希望从一张纸上获取数据并直接将其复制到另一张纸上。您还希望在编辑时发生这种情况。

您可以尝试将可选参数与.inputSheet() 一起使用,并指定您要复制的模板,看看是否有效:

function myFunction() {
  var source = SpreadsheetApp.openById('sourceID');
  var sourceSheet = source.getSheetByName('Sample: Restriction Updates');
  var destinationSheet = SpreadsheetApp.openById('DestinationID');
  destinationSheet.insertSheet('Test',{template: sourceSheet});

这会将值和格式从 sourceSheet 转移到destinationSheet 中的新工作表中。

至于自动化此过程,您可以使用.onEdit(e) 触发器在电子表格中的值发生更改时运行此过程,或者您可以设置触发器以在特定基础上运行它。您可以使用 Apps Script Ui 设置触发器,也可以编写脚本并运行它。以下链接:

参考:

【讨论】:

  • 您好,感谢您的意见。我试过但它提示:1.异常:在对象SpreadsheetApp上获取方法或属性openById时出现意外错误。 2. 错误例外:指定的工作表必须是电子表格的一部分。 myFunction@Code.gs:5
  • 啊,那么 .insertSheet() 在这种情况下将不起作用。我很抱歉;认为它可以跨页工作。不过我不确定第一个错误。
  • 不用担心。如果您知道如何操作,请随时告诉我! :)
【解决方案2】:

您的 copyTab 函数应该可以工作,以便在工作表上的任何更改上运行它,create an onEdit trigger

function onEdit(e) {
  var editedSheet = e.source.getActiveSheet();
  if (editedSheet.getName() === "Sample: Restriction Updates")
  {
    copyTab();
  }
}

注意:如果您的工作表被大量编辑(每秒编辑很少),您可能希望使用 Lock service 来提高触发器的性能,因此您的 copyTab 函数将不会运行而另一个实例还没有完成:

function copyTab() {

  // paste at the beginning of copyTab function:
  var lock = LockService.getScriptLock();
  try {
    lock.waitLock(30000); // wait 30 seconds for others' use of the code section and lock to stop and then proceed
  } catch (e) {
    Logger.log('Could not obtain lock after 30 seconds, exiting function call.');
    return;
  }

  // rest of your function code
  ..

  // IMPORTANT release a lock in the end of function
  lock.releaseLock();
}

【讨论】:

  • 您好,感谢您的意见。是的,copytab,但它只适用于在同一个电子表格(SourceID)中复制它。我会要求将其与所有表单一起复制到另一个电子表格(DestinationID)的特定选项卡(测试),并在编辑时进行更新。知道如何实现这一目标吗?
  • 如果您需要,我有一个简单的电子表格供您参考。太感谢了! stackoverflow.com/questions/71230434/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多