Макрос: копирование значений с одного листа на другой, в зависимости от имени листа и конкретных столбцов - PullRequest
1 голос
/ 30 октября 2019

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

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

Макрос предназначен для копирования данных из Column1 и Column2 на MainSheet и основан на информациив столбцах SheetName и Date вставьте его в соответствующие ячейки на дополнительных листах. Повторите этот процесс для каждой записи в MainSheet.

Вот пример изображения этого процесса: Пример MainSheet Пример SheetA Пример SheetB

Опять же, я был бы признателен за любую помощь, которую я могу получить. Большое спасибо!

Редактировать: Вот Ссылка на пример таблицы Google Sheets.

--- Valraz

Ответы [ 4 ]

1 голос
/ 30 октября 2019

Эта функция будет искать столбцы в листах A, B ..., которые соответствуют столбцам в мастере, и добавлять эти данные для имен листов в ColumnA. Неважно, как расположены столбцы в листах. Таким образом, он работает немного медленнее, чем предполагая исправление расположения. Но мне было скучно делать это все время одинаково.

function copyData() {
  var ss=SpreadsheetApp.getActive();
  var msh=ss.getSheetByName('MainSheet');
  var mrg=msh.getRange(1,1,msh.getLastRow(),msh.getLastColumn());
  var vA=mrg.getValues();
  var hA=vA[0];
  var hObj={};
  hA.forEach(function(e,i){if(e){hObj[e]=i;}});
  vA.forEach(function(row,i){
    if(i>0) {
      var pA=[];
      var sh=ss.getSheetByName(row[hObj['SheetName']]);
      var shA=sh.getRange(1,1,1,sh.getLastColumn()).getValues()[0];
      var shObj={};
      shA.forEach(function(e,i){if(e){shObj[e]=i;}});
      row.forEach(function(c,j){
        if(shObj.hasOwnProperty(hA[j])) {
          pA.push(c);
        }
      });
      sh.appendRow(pA);
    }
  });
}

Это прямой способ сделать это.

function copyData1() {
  var ss=SpreadsheetApp.getActive();
  var msh=ss.getSheetByName('MainSheet');
  var mrg=msh.getDataRange();
  var vA=mrg.getValues();
  vA.forEach(function(r,i){
    if(i>0) {
      var sh=ss.getSheetByName(r[0]);
      sh.appendRow([r[1],r[2],r[3]],r[4]);//Modified for more columns
    }
  });
}
0 голосов
/ 01 ноября 2019

Здесь, как я уже говорил, используйте Query, и это автоматически создаст ваш лист и получит следующую дату:

function CopyDataFromMainSheet() {
  var spreadsheet = SpreadsheetApp.getActive();
  var mysheet;
  mysheet=spreadsheet.getSheetByName('MainSheet');
  //8 is spare columns that may be can used
  var myrange=mysheet.getRange('A1').offset(0, mysheet.getLastColumn()+8);
  myrange.setFormula('=Query(MainSheet!A2:A' + mysheet.getLastRow() + ',"Select A ,count(A) Group By A",0)'); 
  var jojo=mysheet.getRange(1,myrange.getColumn(),mysheet.getLastRow(),1).getValues();
  //Clear Query
  myrange.clear();
  for  (a=1 ;a<jojo.length;a++){
    //Create New Sheet That Not found included with header
    if(spreadsheet.getSheetByName(jojo[a][0])==null) if (jojo[a][0]!='') {
      spreadsheet.insertSheet(jojo[a][0]);
      spreadsheet.getRange('MainSheet!1:1').copyTo(spreadsheet.getSheetByName(jojo[a][0]).getRange("A1"), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
    }

    if(spreadsheet.getSheetByName(jojo[a][0])!=null) if (jojo[a][0]!='') {
      var myDate=new Date('1 jan 1900');

      var DestLastRow = spreadsheet.getSheetByName(jojo[a][0]).getLastRow();
      if (DestLastRow>1) myDate=new Date(spreadsheet.getSheetByName(jojo[a][0]).getRange('B' + DestLastRow).getValue());
      var dateStr = [
                  myDate.getFullYear(),
                  ('0' + (myDate.getMonth() + 1)).slice(-2),
                  ('0' + myDate.getDate()).slice(-2)
               ].join('-');
      myrange.setFormula('=Query(MainSheet!A:E,"Select * where A=\'' + jojo[a][0] + '\' and B>date \'' + dateStr + '\'",0)'); 

      var RsltRange=myrange.getA1Notation() + ":" + 
          mysheet.getRange("A1").offset(mysheet.getLastRow()-1,
          mysheet.getLastColumn()-1).getA1Notation();
      //Copy Value
      spreadsheet.getRange('MainSheet!' + RsltRange).copyTo(spreadsheet.getSheetByName(jojo[a][0]).getRange("A"+DestLastRow), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
      //copy format
      spreadsheet.getRange('MainSheet!' + RsltRange).copyTo(spreadsheet.getSheetByName(jojo[a][0]).getRange("A"+DestLastRow), SpreadsheetApp.CopyPasteType.PASTE_FORMAT, false);

      myrange.clear();
    }
  }
};
0 голосов
/ 31 октября 2019

В листе А введите следующую формулу:

=QUERY(MainSheet!A:D,"select * where A='Sheet A'",-1)

В листе B введите следующую формулу:

=QUERY(MainSheet!A:D,"select * where A='Sheet B'",-1)

И вы можете сделать это в своем скрипте макроса или в приложении Google

0 голосов
/ 30 октября 2019

Жизненно важный вопрос, я думаю, как ваши листы А и Б получают данные? Это кто-то, кто вставляет данные или скрипт, который делает это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...