Google Sheet не копирует строки на правильный лист - PullRequest
0 голосов
/ 12 июля 2020

Я разделяю лист данных на несколько листов, используя адрес электронной почты в качестве уникального идентификатора.

Я использую вариант какого-то скрипта, который я нашел и отредактировал, но использую copyTo, а не appendRow.

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

Я подумал, что это, возможно, потому, что я использую getActiveSheet, а не явно таргетинг правильный лист, поэтому я попытался сделать это, используя что-то вроде: getSheetByName (emailAddress [i] [0]).

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

Ниже приведен сценарий, который «работает», но копирует последнюю строку на следующий лист.

  function myFunction() {
  
  var theWorkbook = SpreadsheetApp.getActiveSpreadsheet();
  var theSheet = theWorkbook.getSheetByName("Copied");
  
  // This var will contain all the values from column B -> The email addresses
  var theEmails = theSheet.getRange("B:B").getValues();

  // This var will contain all the rows
  var rows = theSheet.getDataRange().getValues();
  
  //Set the first row as the header
  var header = rows[0];

  //Store the Sheets already created
  var completedSheets = []

  //The last created Sheet
  var last = theEmails[1][0]


  for (var i = 1; i < theEmails.length; i++) {    

    //Check if the Sheet is already done, if not create the sheet
    if(!completedSheets.includes(theEmails[i][0])) {

      //Set the Sheet name = email address (except if there is no name, then = Blank)
      if (theEmails[i][0] === "") {
        var currentSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet("Blank");
      } else {
        var currentSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(theEmails[i][0]);
      }


      //append the header
      currentSheet.appendRow(header);
      var rowtocopy = theSheet.getRange(i,1,1,8);
      rowtocopy.copyTo(currentSheet.getRange(currentSheet.getLastRow()+1, 1));
      completedSheets.push(theEmails[i][0])
      last = theEmails[i][0]
    } else if (last == theEmails[i][0]) {      
      
    // If the sheet is created append the row to the sheet
      var currentSheet = SpreadsheetApp.getActiveSpreadsheet();
      var activespreadsheet = SpreadsheetApp.getActiveSheet();
      var rowtocopy = theSheet.getRange(i,1,1,8);
      rowtocopy.copyTo(activespreadsheet.getRange(activespreadsheet.getLastRow()+1, 1));  
      
    }

  }
 

}

И фрагмент кода, в котором я пытаюсь назвать лист (и многие его варианты), хотя это возвращает нулевую ошибку.

else if (last == theEmails[i][0]) {      
  
// If the sheet is created append the row to the sheet
  var currentSheet = SpreadsheetApp.getActiveSpreadsheet();
   var activespreadsheet =SpreadsheetApp.getActive().getSheetByName(last);
   var rowtocopy = theSheet.getRange(i,1,1,8);
  rowtocopy.copyTo(activespreadsheet.getRange(activespreadsheet.getLastRow()+1, 1));  

Что я делаю не так?

1 Ответ

1 голос
/ 12 июля 2020

Это класс. c Уточняется, что массив значений основан на нулевом индексе, а «строки» и «столбцы» API основаны на индексе 1.

В вашем for l oop, вы используете один и тот же индекс i как для массива значений, так и для параметра «строка» API в ваших вызовах getRange(row, ...). Любой, кто работает с Таблицами, проделывал это с собой, вероятно, много раз. *

...