自动将值从一个Google工作表复制并粘贴到另一个工作表

时间:2019-12-16 04:35:57

标签: google-apps-script google-sheets

每个链接下面的电子表格中有2张纸:

Database

第一个被称为“事件/事件”,记录所有事件数据,包括投诉,表扬,事故和未遂事件。如果发生需要保险索赔的事件,用户将在Y列中打勾,这将要求另一个用户提出索赔。因此,我创建了第二张标题为“保险索赔”的表格。这就像甘特图在保险索赔中安排进度的进度。

一旦初始用户在“事件/突发事件”的Y列中打勾,我希望将相应行中多个单元格的值复制并粘贴到“保险索赔表”中。

我仍在学习编写代码,因此我倾向于从其他Stack Overflow答案中获取代码,但我为此感到吃力。这是我目前的尝试,但我感觉我缺少该功能的关键部分。

//Data from Events/Incidents Sheet to Insurance Claims Sheet
function dataInsuranceClaimsSheet() {

  // setup spreadsheet and sheets
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sourcesheetname = "Events/Incidents";
  var source = spreadsheet.getSheetByName(sourcesheetname);
  var targetsheetname = "Insurance Claims";
  var target = spreadsheet.getSheetByName(targetsheetname);
  var trigger = source.getRange(3, 1, 1, 25) //column Y of Events/Incidents sheet

  // get Form Response
  //Logger.log(JSON.stringify());
  var row = source.range.getRow();
  var range = source.getRange(row, 1, 1, 26);
  
  //Logger.log("DEBUG: The range is "+range.getA1Notation());  
  var values = range.getValues();  
  var sourceDate = values[0][1]
  var sourceId = values[0][2];
  var sourceBranch = values[0][3];
  var sourceEmployee = values[0][5]
  var sourceFleet = values[0][7];
  var sourceRoute = values[0][8];
  var sourceDescription = values[0][17]
  var targetDate = values[0][1]
  var targetId = values[0][2];
  var targetBranch = values[0][3];
  var targetEmployee = values[0][4]
  var targetFleet = values[0][5];
  var targetRoute = values[0][6];
  var targetDescription = values[0][7]  
     
     
   //update the Insurance Claims sheet
   var targetupdate = [];
   var targetfinal=[];

   // push the values to a blank array
   targetupdate.push(sourceDate); // Date
   targetupdate.push(sourceId); // ID
   targetupdate.push(sourceBranch);// Branch
   targetupdate.push(sourceEmployee); // Employee
   targetupdate.push(sourceFleet); // Fleet
   targetupdate.push(SourceRoute);// Route
   targetupdate.push(sourceDescription);// Description
     
   // if column Y of the Events/Incidents sheet = TRUE then copy the data from the Events/Incidents sheet and paste into the defined cells of the Insurance Claims sheet
   if (trigger == TRUE);
   targetfinal.push(targetupdate);

   // get Insurance Claims data
   var targetLR = target.getLastRow();
   var targetupdaterange = target.getRange(targetLR+1,1,1,8);
   Logger.log("DEBUG: The target range = "+targetupdaterange.getA1Notation());

   // update the form values to the Insurance Claims sheet
   targetupdaterange.setValues(targetfinal);

    }

我真的很感谢这个帮助。

1 个答案:

答案 0 :(得分:1)

我认为:

  • 您要在工作表{{1}中的Y列的每个单元格中都有一个复选框。
  • 您希望每次选中这些复选框之一时,相应行中的数据就会附加到名为Events/Incidents的工作表中。

如果是这种情况,则可以使用onEdit trigger,然后在触发的函数中检查是否:

  • 编辑后的工作表为Insurance Claims
  • 已修改的列为Y(索引25)。
  • 已编辑的行位于2上方。
  • 该复选框已选中(Events/Incidents)。

要检查这些条件,我们需要知道哪些列,行和工作表已被编辑,我们可以通过使用event object获得该信息。

然后,如果满足这些条件,则需要检索相应行中的数据。之后,由于我们不希望复制原始行中的所有值,因此必须从相应的数组中删除其中一些值。方法splice可以用于此目的。最后,appendRow可用于将所选数据添加到true。您的功能可能是这样的:

Insurance Claims

请记住,如果您的代码中已经有一个function onEdit(e) { var range = e.range; var sheet = range.getSheet(); var row = range.getRow(); var column = range.getColumn(); var sourcesheetname = "Events/Incidents"; var checkbox = range.getValue(); if (sheet.getName() == sourcesheetname && column == 25 && row > 2 && checkbox == true) { var targetsheetname = "Insurance Claims"; var target = e.source.getSheetByName(targetsheetname); var numCols = sheet.getLastColumn(); var values = sheet.getRange(row, 1, 1, numCols).getValues()[0]; values.splice(17) values.splice(8, 8) values.splice(5, 1) values.splice(3, 1); // Removing undesired values var lastRow = target.getLastRow(); var lastCol = target.getLastColumn(); target.appendRow(values); // Append new row } } 触发器,则应将此代码添加到现有的onEdit中。否则,只有其中之一会开火。

我希望这会有所帮助。