简体   繁体   中英

Remove a row from a sheet and copy to another spreadsheet

I have managed to remove a row and place in a sheet within the same Google spreadsheet. However when I modify the script to copy a row onto a different sheet, nothing happens:

function onEdit(event) {
  var ss =SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();

if(s.getName() == "CONTRACT REGISTRY DOCUMENT" && r.getColumn() == 58 && r.getValue() == "X") {
 var row = r.getRow();
 var numColumns = s.getLastColumn();
 var destination = SpreadsheetApp.openById('...');
 var targetSheet = destination.getSheetByName("NOT RENEWED");
 var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
 s.getRange(row, 1, 1, numColumns).moveTo(target);
 s.deleteRow(row);
 }

The moveTo method can only move data within the same spreadsheet. It is best practice to use range.getValues() and range.setValues() to achieve the same behavior in different spreadsheets.

function onEdit(event) {
  var ss =SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();

if(s.getName() == "CONTRACT REGISTRY DOCUMENT" && r.getColumn() == 58 && r.getValue() == "X") {
 var row = r.getRow();
 var numColumns = s.getLastColumn();
 var data = r.getValues();

 // please supply the destination file ID as parameter here
 var destination = SpreadsheetApp.openById('...');

 var targetSheet = destination.getSheetByName("NOT RENEWED");
 var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
 target.setValues(data);
 s.deleteRow(row);
 }
}

It seems the problem here is that you're trying to access another file from your trigger (onEdit), but that is not possible because it'd require permission to change another spreadsheet: https://developers.google.com/apps-script/guides/triggers#restrictions

According to a related question , an installable trigger is the way to go here.

In this case, you need to add something like this to your code and run it to create the trigger:

function createSpreadsheetOnEditTrigger() {
  var ss = SpreadsheetApp.getActive();
  ScriptApp.newTrigger('moveRowToAnotherSheet')
  .forSpreadsheet(ss)
  .onEdit()
  .create();
}

Based on this trigger, it is necessary to make a few changes to the original code you posted:

function moveRowToAnotherSheet() {
  var ss = SpreadsheetApp.getActiveSpreadsheet(); 
  var s = ss.getActiveSheet(); // Changed
  var r = s.getActiveRange(); // Changed
  if(s.getName() == "CONTRACT REGISTRY DOCUMENT" && r.getColumn() == 58 && r.getValue() == "X") {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var destination = SpreadsheetApp.openById('...');
    var targetSheet = destination.getSheetByName("NOT RENEWED");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1, 1, targetSheet.getLastColumn()); // Changed
    target.setValues(s.getRange(row, 1, 1, numColumns).getValues()); // Added to use setValues instead of moveTo
    s.deleteRow(row);
  }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM