Справка Google Sheet Script - Сохранение / запись идентификатора листа, имени листа, местоположения ячейки для комбинированного диапазона - PullRequest
0 голосов
/ 30 января 2019

Я создал скрипт для объединения информации из нескольких вкладок во вкладку «Основные элементы».Скрипт вытягивает строки, помеченные знаком MS, и он отлично работает.Тем не менее, я также хочу добавить Sheetname, Sheet IT и добавить ссылку на вкладку источника для каждой строки с "MS".Эта информация в настоящее время не сохраняется ни на одной из вкладок источника.Это возможно сделать в сценарии?

function combineData() {

  var destination = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Masterelements');

  // TO CLEAR DESTINATION TAB BEFORE REPOPULATION
  destination.getRange('A2:g1000').clearContent();


  //VARIABLE TO CYCLE THROUGH SPECIFIC SHEETS 
  var tabs = [
    'A-000',
    'B-123',
  ];

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  for (var s = 0; s < tabs.length; s++) {
    var sheet = ss.getSheetByName(tabs[s]);
    Logger.log(sheet.getLastRow());
    var range = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn());
    var destination = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Masterelements');
    var values = range.getValues();

    //Destination parameters - equivalent to destination.getRange(); 
    var numberOfColumns = 7;
    var numberOfRows = 1;
    var startColumn = 1;
    var startRow = 2;

    var count = 0

    // IDENTIFY THE FIRST ROW TO  CONSOLIDATE ITEMS
    var destRow = destination.getLastRow() + 1

    for (var i = 0; i < values.length; i++) {
      Logger.log("i is now: " + i);
      Logger.log("Current row value: " + values[i][0])

      if (values[i][0] == 'MS') {
        Logger.log("*** Value found in cloumn: " + values[i][0] + "**** \n Count: " + i);
        count++;

        var rangeToCopy = sheet.getRange((i + 1), 1, numberOfRows, numberOfColumns);

        var destinationRange = destination.getRange(destRow, startColumn, numberOfRows, numberOfColumns);
        destRow++;
        Logger.log("Next Destination row: " + destRow);
        rangeToCopy.copyTo(destinationRange, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);

      }
    }
  }
}

1 Ответ

0 голосов
/ 31 января 2019

ОП предоставил рабочий код, который копирует строки из двух конкретных листов со значением «MS» в столбце А. Однако ОП также хотел:

  • Имя листа
  • Идентификатор листа
  • можно указать ссылку на вкладку источника для каждой строки с "MS"

Их довольно просто создать, но для их использования требуется слишком много информации.объясните в комментарии.

Я взял оригинальный код ОП.Я переместил и / или отредактировал некоторые строки, чтобы сделать код немного более эффективным.Я также добавил несколько строк кода для вставки имени листа в Masterelements: столбец H, идентификатор листа в Masterelements: столбец I и ссылку на соответствующий лист в Masterelements: столбец J.

Я думаю, что тамэто область, которая делает код более эффективным (особенно внутри циклов), но это то, что OP может рассмотреть, если время выполнения «реальных данных» неоправданно.

function so54432164() {

  // setup the spreadsheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // get the spreadsheet URL - required for the hyperlink
  var ssurl = ss.getUrl();
  //Logger.log("DEBUG: The url for this spreadsheet is "+ssurl);//DEBUG

  var destination = ss.getSheetByName('Masterelements');

  // CLEAR DESTINATION TAB BEFORE REPOPULATION
  // clear the entire destination sheet; this is more efficient that just clearing a nominated range
  destination.clearContents();

  // IDENTIFY THE first ROW TO  CONSOLIDATE ITEMS
  var destRow = destination.getLastRow() + 1

  //VARIABLE TO CYCLE THROUGH SPECIFIC SHEETS
  // note: no comma after the second tab name
  var tabs = [
    'A-000',
    'B-123'
  ];


  //Destination parameters 
  // note: brought this out of the "for" loop since only need to be declared once.
  var numberOfColumns = 7;
  var numberOfRows = 1;
  var startColumn = 1;
  var startRow = 2;
  // used for destination.getRange();  


  // Loop through the sheets  
  for (var s = 0; s < tabs.length; s++) {

    var sheet = ss.getSheetByName(tabs[s]);

    // create variables to get the Sheet Name and the sheetID
    var sheetname = sheet.getSheetName();
    var sheetID = sheet.getSheetId();
    //Logger.log("DEBUG: sheet: "+sheetname+", SheetID: "+sheetID);//DEBUG

    // get the data: the var 'range' was never used, so we can just call the values direct to 'values'.
    var values = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).getValues();


    //LOOP through the rows in the target sheet
    for (var i = 0; i < values.length; i++) {

      //Logger.log("DEBUG: row = " + i+", and Column A value: " + values[i][0]);//DEBUG

      // test for "MS" in Column A
      if (values[i][0] == 'MS') {

        //Logger.log("DEBUG: Found MS, Count: " + i);//DEBUG

        // define the range to copy 
        var rangeToCopy = sheet.getRange((i + 1), 1, numberOfRows, numberOfColumns);
        // Logger.log("DEBUG: the rangetocopy is "+rangeToCopy.getA1Notation()); //DEBUG

        // Define the destination range      
        var destinationRange = destination.getRange(destRow, startColumn, numberOfRows, numberOfColumns);
        //Logger.log("DEBUG: the destination range "+destinationRange.getA1Notation());//DEBUG

        // copy the source to the target
        rangeToCopy.copyTo(destinationRange, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);

        // create a variable for the hyperlink formula
        var formula = '=HYPERLINK("' + ssurl + '#gid=' + sheetID + '")';
        // Logger.log("DEBUG: the formula = "+formula);//DEBUG

        // create a variable for the extra data: Sheet name, Sheet ID, and the hyperlink to the sheet.
        var extradata = [
          [sheetname, sheetID, formula]
        ];

        //define the destination range and set the values
        destination.getRange(destRow, numberOfColumns + 1, numberOfRows, 3).setValues(extradata);

        // increment the destination row
        destRow++;
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...