Изчистете съдържанието и копирайте от друг лист

Написах скрипт, който възнамерява да изчисти съдържанието на електронна таблица в Google Таблици и да копира и постави съдържанието на друг лист.

Листът, който трябва да бъде изчистен, се нарича „NEW_SHEET“, а този, върху който трябва да се копира, се нарича „База данни“.

По някаква причина скриптът не работи в момента. Нищо не се случва, когато го стартирам. Освен това в момента използвам .getActiveRange, за да избера диапазона за изчистване. Бих искал обаче това да са колони от A до AC и само до последния ред с данни в него.

Това е кодът, който използвам:

function importDB() {
  //Delete content of New Sheet
  var sh1 = SpreadsheetApp.openById('SHEET_ID').getSheetByName('NEW_SHEET')
  var range1 = sh1.getActiveRange()
  range1.clearContent()

  //Copy new database data
 var sh = SpreadsheetApp.openById('SHEET_ID').getSheetByName('Database')
   var range = sh.getDataRange();  
   var data = range.getValues();
   var ts = SpreadsheetApp.openById('SHEET_ID').getSheetByName('NEW_SHEET')
   ts.setValues(data)
}

person franciscofcosta    schedule 03.04.2018    source източник
comment
И? Какви алтернативи на getActiveRange сте опитвали? Има няколко, които трябваше да откриете по време на проучването преди въпроса. Вие също не посочвате как се извиква тази функция.   -  person tehhowch    schedule 03.04.2018
comment
Опитах също getDataRange, което също не работи. Това е само функцията importDB (). Благодаря ти!   -  person franciscofcosta    schedule 03.04.2018
comment
не работи не е адекватен при търсене на помощ. Грешки? Когато отстранявате грешки, в какво всъщност се превръща обектът и какъв очаквахте да бъде? Вашата отговорност е да преобразувате точно това, което сте направили, и как точно не постига това, което възнамерявате да направите.   -  person tehhowch    schedule 03.04.2018
comment
Обърнете внимание, че вашето setValues повикване трябва да бъде на Range обект, но се опитвате да го извикате от Sheet обект. Бих очаквал тук да бъде изведена грешка.   -  person tehhowch    schedule 03.04.2018


Отговори (1)


Не трябва да използвате getActiveRange() тук. Кодът по-долу трябва да работи.

function importDB() {
  //Delete contents of "A:AC" in New Sheet
  var sh1 = SpreadsheetApp.openById('SHEET_ID').getSheetByName('NEW_SHEET').getRange("A:AC");
  sh1.clearContent();

  //Copy new database data
  var sh = SpreadsheetApp.openById('SHEET_ID').getSheetByName('Database');
  var range = sh.getDataRange();  
  range.copyTo(sh1.getCell(1,1));
}

С функцията copyTo() вие има значение само първата клетка в дестинацията. Така че трябва да внимавате данните, които се копират от „База данни“, да не надхвърлят колона AC, в противен случай ще презапишете тези данни в „NEW_SHEET“. За да предотвратите това, можете да опитате var range = sh.getRange("A:AC") вместо да копирате целия диапазон от данни.

person Diego    schedule 03.04.2018
comment
Благодаря ти много! Трябваше да направя няколко корекции на вашия код, защото изходният и целевият лист не бяха част от един и същ файл с електронна таблица. Така че трябваше да използвам setValues вместо range.copyTo. Но вашият код работи перфектно, освен това. - person franciscofcosta; 03.04.2018