【问题标题】:How to copy a range of data to another google sheet using google apps script?如何使用谷歌应用脚​​本将一系列数据复制到另一个谷歌工作表?
【发布时间】:2021-10-11 00:10:49
【问题描述】:

来源:

目的地:

大家好,

我有 2 张谷歌表格,SourceDestination。我想使用谷歌应用程序脚本将一系列数据从源表复制到目标表。所以数据应该出现在目标表的最后一行。这是我的代码:

function copyInfo() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var copySheet = ss.getSheetByName("Source");
  var pasteSheet = ss.getSheetByName("Destination");

  // get source range
  var source = copySheet.getRange(3,1,1,10);
  // get destination range
  var destination = pasteSheet.getRange(pasteSheet.getLastRow()+1,1,1,10);

  // copy values to destination range
  source.copyTo(destination);

}

似乎脚本只允许我在一个谷歌表(不同的标签)而不是两个不同的谷歌表中进行复制。我可以知道我应该如何修改它,以便脚本能够找到我的目标谷歌表并将数据粘贴到最后一行?任何帮助将不胜感激!

编辑

我尝试使用onEdit 触发脚本,但似乎无法正常工作。以下是我的脚本:

function onEdit(e) {

  if (e.range.columnStart == 11 && e.range.rowStart == 3){
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    const id ='1r5Hygl5ysahMi6DQ3duDR5L8c4aGX_0CJba7lXxnejw';
    var copySheet = ss.getSheetByName("Sheet1");
    var pasteSheet = SpreadsheetApp.openById(id).getSheetByName("Sheet1");
    
    if (e.value == 'Submit'){
      var source = copySheet.getRange(3,1,1,10);
      const values = source.getValues();
      var destination = pasteSheet.getRange(pasteSheet.getLastRow()+1,1,1,10);
      destination.setValues(values);
    }
  }
}

来源: https://docs.google.com/spreadsheets/d/1jnOvE-Dc7y9o7GsgN9fjOXZWlUCwiJayugX5q4Y3CA0/edit#gid=0

目的地: https://docs.google.com/spreadsheets/d/1r5Hygl5ysahMi6DQ3duDR5L8c4aGX_0CJba7lXxnejw/edit#gid=0

【问题讨论】:

    标签: google-apps-script google-sheets copy-paste


    【解决方案1】:

    使用Range.getValues()Range.setValues()

    const id ='ID of paste Spreadsheet';
    var pasteSheet = SpreadsheetApp.openById(id).getSheetByName("Destination");
      var destination = pasteSheet.getRange(pasteSheet.getLastRow()+1,1,1,10);
      const values = source.getValues();
      destination.setValues(values);
    

    【讨论】:

    • 您好,感谢您的回复。我尝试在onEdit 函数中应用您的方法以触发脚本,但是,它不起作用,请问我哪里做错了吗?我用修改后的脚本编辑了我的问题
    • 您能提供onEditexecution result 吗?我认为你的代码没有问题。
    • TypeError: Cannot read property 'range' of undefined,这是我得到的错误,我也在我的问题中附上了我的谷歌表格。
    • 似乎简单的触发器 (onEdit) 不允许您参考其他电子表格。相反,您需要更改触发器名称(例如_onEdit(e))和create an onEdit yourself
    • 否,将函数名称 onEdit 更改为 _onEditcreate a new trigger,以运行:_onEdit,事件源:来自电子表格,事件类型:编辑中
    【解决方案2】:

    getSheetByName 方法用于在电子表格中定义工作表。要定义特定的电子表格,您应该使用openById 并关联spreadhseet ID (https://docs.google.com/spreadsheets/d/{spreadsheet ID}/edit)。

    将您的源表定义为:

    var copysheet = SpreadsheetApp.openById('enter id for Source').getSheetByName('Sheet 1')
    

    将您的目标工作表定义为:

    var pastesheet = SpreadsheetApp.openById('enter id for Destination').getSheetByName('Sheet 1')
    

    【讨论】:

      【解决方案3】:

      如果我理解正确,您的目标如下:

      /* Every time a user sets the value of cell K3 in source spreadsheet
         to "submit". Copy all the values of row 3 and paste them into the
         destination sheet under the last row. Then delete the source values 
         and set the value of K3 to "Clear" again. */
      

      您需要一个已安装的触发器和一个在触发时复制值的函数。所以让我们一步一步来。

      示例:

      1. 首先让我们创建一个绑定到源 SS 的脚本。让我们编辑您的 copyInfo() 函数,使其将目标电子表格 ID 作为参数。
      function copyTo(destinationSSId) {
          // Open source SS at tab named "Source"
          let copySheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Source");
          // Open destination SS at tab named "Destination"
          let pasteSheet = SpreadsheetApp.openById(destinationSSId).getSheetByName("Destination");
          // Get source values
          let sourceValues = copySheet.getRange(3, 1, 1, 10).getValues();
          // Set values to destination range
          pasteSheet.getRange(pasteSheet.getLastRow() + 1, 1, 1, 10).setValues(sourceValues);
          // Log the pasted values from the last row
          console.log("Last row pasted: " + pasteSheet.getRange(pasteSheet.getLastRow(), 1, 1, 10).getValues()[0]);
      }
      
      1. 创建一个函数来清除源值并重置“表单”。
      function clearSubmission() {
          let copySheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Source");
          copySheet.getRange(3, 1, 1, 10).clearContent()
          copySheet.getRange(3, 11, 1, 1).setValue("Clear");
          console.log("Source submitted and cleared.")
      }
      
      1. 设置要触发的函数。
      function myTriggeredFunction(e) {
          console.log(JSON.stringify(e.range), e.value)
          if (e.range.columnStart == 11 && e.range.rowStart == 3) {
              if (e.value == 'Submit') {
                  let destinationSSId = '{YOUR DESTINATION SS ID}';
                  copyTo(destinationSSId);
                  clearSubmission();
              }
          }
      }
      
      1. 通过转到项目中的“触发器”选项卡,将触发器安装为“来自电子表格 - 编辑时”以运行函数 myTriggeredFunction

      【讨论】:

        猜你喜欢
        • 2011-05-29
        • 2020-01-18
        • 1970-01-01
        • 2021-06-10
        • 1970-01-01
        • 2021-12-04
        • 1970-01-01
        • 2021-06-05
        • 2023-03-13
        相关资源
        最近更新 更多