Google Apps Script - копирование строк с одного листа, содержащих сегодняшнюю дату, на другой - PullRequest
0 голосов
/ 22 мая 2019

То, что я пытаюсь сделать, находится в одной электронной таблице, посмотрите на лист «Источник», если ячейка в столбце B содержит сегодняшнюю дату, затем скопируйте ячейки между A: B для этой ячейки и вставьте в следующую пустую строку на листе."Место назначения".

Повторите для всех ячеек, содержащих сегодняшнюю дату.

Это работает, если я ищу текст, но по сути я пытаюсь сделать это автоматически каждый день, когда меняется дата, и я могу '• чтобы функция даты работала правильно.

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

Я довольно новичок во всем этом, и любая помощь будет принята с благодарностью.

function copy_test() {

  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Source"); //Source sheet
  var ds = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Destination"); //Destination sheet
  var testrange = ss.getRange('B:B'); //Column to check for today's date
  var testvalue = (testrange.getValues()); //What value to check
  var today = Utilities.formatDate(new Date(), 'GMT-0', 'dd/MM/yyyy');
  var data = [];
  var j = [];

  //Condition to check in B:B, if true, copy the same row to data array 
  for (i=0;i<testvalue.length;i++) {
    if (testvalue[i] == today) {
    data.push.apply(data,ss.getRange(i+1,1,1,3).getValues());
  //Copy matched ROW numbers to j
    j.push(i);
}  
}
  //Copy data array to destination sheet
  ds.getRange(ds.getLastRow()+1,1,data.length,data[0].length).setValues(data);
}

Я получаю следующую ошибку:

TypeError: Невозможно прочитать свойство "length" изне определено.(строка 20, файл «Первый тест»)

Изображение типа данных, которые я хочу скопировать

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

На случай, если кто-нибудь столкнется с этой проблемой в будущем. Я еще немного повозился с оригинальным кодом и смог заставить его работать:

function copyrange() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Source'); //source sheet
  var testrange = sheet.getRange('B:B');
  var testvalue = (testrange.setNumberFormat("@").getValues());
  var ds = ss.getSheetByName('Destination'); //destination sheet
  var data = [];
  var j =[];
  var dt = new Date();
  var today = Utilities.formatDate(new Date(), 'GMT-0', 'dd/MM/yyyy')

  //Condition to check in B:B, if true, copy the same row to data array 
  for (i=0;i<testvalue.length;i++) {
    if (testvalue[i] == today) {
    data.push.apply(data,sheet.getRange(i+1,1,1,3).getValues());
  //Copy matched ROW numbers to j
    j.push(i);
}  
}
  //Copy data array to destination sheet
  ds.getRange(ds.getLastRow()+1,1,data.length,data[0].length).setValues(data);
}

В частности var testvalue, где я добавил setNumberFormat для дат в виде текста, потому что это единственный способ, которым он будет работать для if (testvalue[i] == today)

Спасибо @Cooper за то, что сделали снимок.

0 голосов
/ 22 мая 2019

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

function copy_test() {
  var ss=SpreadsheetApp.getActive();
  var ssh=ss.getSheetByName("Source");
  var dsh=ss.getSheetByName("Destination");
  var rg=ssh.getRange(1,1,ssh.getLastRow(),3);//I just took the first three columns instead
  var vA=rg.getValues();
  var dt=new Date();
  var today=new Date(dt.getFullYear(),dt.getMonth(),dt.getDate()).valueOf();//midnight
  for(var i=0;i<vA.length;i++) {
    var d=new Date(vA[i][1]);//column B
    if (new Date(d.getFullYear(),d.getMonth(),d.getDate()).valueOf() == today) {
      dsh.appendRow(vA[i]);
    }  
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...