Как я могу скопировать информацию с одного листа на другой? - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь написать скрипт для копирования информации с одного листа на другой в Google Sheets, как ежедневное обновление. Информация по строкам (например, строка 5 содержит всю информацию, которую я хочу скопировать, с указанием даты в столбце A) Если дата в записи (столбец A) не совпадает с сегодняшней датой, то всю строку необходимо перенести на другой лист.

У меня возникли проблемы при сравнении ячейки, содержащей дату, в которую информация была введена, с сегодняшней датой, затем захвата номера строки этой ячейки, а затем настройки переменных для копирования.

На новом листе необходимо отсканировать диапазон для следующей пустой строки, а затем вставить информацию в следующую пустую строку.

В настоящее время я настроил одну ячейку для копирования / вставки, но я настрою ее для целого ряда ячеек.

ОБНОВЛЕНИЕ: я понял, как скопировать информацию. Мои строки для поиска начинаются на вкладке «Копировать из» в строке 5, и мой код может искать и сравнивать даты, в которые информация была введена в столбце B, с сегодняшней датой. Код с затем скопируйте информацию в этой строке на новую вкладку «Копировать в».

Теперь я хотел бы выяснить, как удалить информацию на вкладке «Копировать из», чтобы она существовала в моей электронной таблице только один раз, либо на вкладке «Копировать из» (если введенная информация относится к сегодняшней дате или в будущем). ) или на вкладке «Копировать в» (если введенная информация относится к предыдущей дате). Я добавил строку кода внизу, чтобы сделать это, но когда я запускаю свой код, он копирует некоторую информацию, удаляя другие части, а также копируя информацию с сегодняшней даты. Любая помощь с этим?

function funcname() {
  var Sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Copy From");
  var Sheet2 =  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Copy To");        
  var ColumntoSearch = 2;
  var LastRow = Sheet.getLastRow();

  //Gets column to search for dates to compare to Today
  var Range = Sheet.getRange(5, ColumntoSearch, LastRow, 1);
  var Values = Range.getValues();

  //Sets the amount of data to copy over
  var NumberofColumns = 27;
  var NumberofRows = 1;

  var DestRow = Sheet2.getLastRow()+1; 

  //Compares all the Dates in the Copy From tab to Today
  var dt=new Date();
  var dt1=new Date(dt.getFullYear(),dt.getMonth(),dt.getDate());
  var dv=new Date(dt.getFullYear(),dt.getMonth(),dt.getDate()).valueOf();
  var d=0;
  for (var i=0;i+d<Values.length;i++){

    //If dates are less than today, they will be copied over to the Copy To tab
    if(new Date(Values[i+d][0]).valueOf()<dv){
      var RangetoCopy = Sheet.getRange((i+5), 1, NumberofRows, NumberofColumns);
      var DestRange = Sheet2.getRange(DestRow, 1, NumberofRows, NumberofColumns);
      DestRow++;
      RangetoCopy.copyTo(DestRange);


      Sheet.deleteRows(i+7);
     }
   }
 }

1 Ответ

0 голосов
/ 12 апреля 2019

Попробуйте это:

Эта функция считывает все даты одновременно и выполняет цикл, сравнивая все даты с сегодняшним днем ​​в 12:00 ночи.Все> или = сегодняшняя дата удаляется из вывода.

function copyDateNotEqualToToday() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName("Copy From");
  var sh2=ss.getSheetByName("New Sheet");
  var rg=sh.getRange(5,1,sh.getLastRow()-4,1);
  var vA=rg.getValues();
  var dt=new Date();
  var dt1=new Date(dt.getFullYear(),dt.getMonth(),dt.getDate());
  var dv=new Date(dt.getFullYear(),dt.getMonth(),dt.getDate()).valueOf();
  var d=0;
  for (var i=0;i+d<vA.length;i++){
    if(new Date(vA[i+d][0]).valueOf()>=dv){
      vA.splice(i+d,1);
      d++;
    }
  }
  sh2.getRange(1,1,vA.length,1).setValues(vA);
}

Мой входной лист:

enter image description here

Мой выходной лист:

enter image description here

То, что я делал, немного отличается от того, что вы делаете.Я взял все элементы в массиве «Значения», которые вы называли> или = текущим днем, и удалил их из массива.Перебрав все строки, я скопировал все значения в лист назначения с помощью ..., чтобы использовать ваши термины setValues(Values), и я ничего не удалял из исходного листа.

Однако чтовы перемещаете данные из источника в место назначения, чтобы иметь возможность удалить текущую строку в качестве цикла.Итак, вот эта функция.

function copyIfLessThan() {
  var Sheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Copy From");
  var Sheet2=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Copy To");        
  var Range=Sheet.getRange(5,2,Sheet.getLastRow(),1);
  var Values=Range.getValues();
  var dt=new Date();
  var dv=new Date(dt.getFullYear(),dt.getMonth(),dt.getDate()).valueOf();
  var d=0;
  for(var i=0;i<Values.length;i++) {
    if(new Date(Values[i][0]).valueOf()<dv){
      var RangetoCopy=Sheet.getRange(i-d+6,1,1,27); 
      var DestRange=Sheet2.getRange(Sheet2.getLastRow()+1,1,1,27);
      RangetoCopy.copyTo(DestRange);
      Sheet.deleteRows(i-d+6);//removing rows not elements of Values Array
      d++;
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...