Запись отсортированных табличных данных в таблицу в отдельном формате с помощью Google Sheets - PullRequest
0 голосов
/ 05 октября 2019

Я относительно новичок в javascript и определенно новичок в скриптах Google.

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

Прилагается пример листа с несколькими строками. На самом деле у меня есть больше столбцов, но они здесь не имеют значения. https://docs.google.com/spreadsheets/d/14dh0IW7vO8c2OLc2O8WE-Ptuh3MJfLWTESVMA_DpOv0/edit?usp=sharing Моя вторая вкладка использует функцию сортировки листов. Когда дата вводится, это создает ошибку. Я собирался объяснить это, используя функцию onEdit () и записывая дату в правильную строку на первой вкладке, а затем очищая столбец даты на второй вкладке (чтобы избежать ошибки и сохранить ее выравнивание).

''javascript
function onEdit() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet2 = ss.getSheetByName("check released");
  var sheet1 = ss.getSheetByName("Log");

  var job2 = sheet2.getRange("A2:A1000").getValues();
  var job1 = sheet1.getRange("A2:A1000").getValues();

  var draw2 = sheet2.getRange("B2:B1000").getValues();
  var draw1 = sheet1.getRange("B2:B1000").getValues();

  var inv2 = sheet2.getRange("C2:C1000").getValues();
  var inv1 = sheet1.getRange("C2:C1000").getValues();

  var dates2 = sheet2.getRange("D2:D1000");
  var dates_values = sheet2.getRange("D2:D1000").getValues();
  var dates1 = sheet1.getRange("D2:D1000");

  var indices = []

  var to_paste = []

  for(var i = 0; i < job2.length; i++) {
    var job2_Value = job2[i][0];
    var draw2_Value = draw2[i][0];
    var inv2_Value = inv2[i][0];
    for(var j=0; j<job2.length; j++) {
      var job1_Value = job1[j][0];
      var draw1_Value = draw1[j][0];
      var inv1_Value = inv1[j][0];
      if((job2_Value != "") && (job1_Value == job2_Value) && (draw1_Value === draw2_Value) && (inv1_Value === inv2_Value)) {
        indices.push([i]); 
      }
    }
  }  

  for(k in indices) {
    to_paste.push([dates2[k]])
  }

  Logger.log(to_paste)
  dates1.setValues(to_paste)
  dates2.clearContent()
  Logger.log("Cleared on check released page")

};
'''

Это код, который я написал, но он не работает, и я не знаю почему. Я также не знаю, где найти консольный журнал.

1 Ответ

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

У вас есть лист "чек выпущен", который берет значения из "листа" Журнал ". Ваша цель - ввести" дату выпуска "в" чеке выпущен "и обновить его до" Журнал ", а затем отразить в" чеке "Освобожден ". Подход, который вы выбрали, состоял в том, чтобы отредактировать фактическое связанное значение" дата выпуска "для" выпущенного чека ". Неудивительно, что это не удалось, поскольку он просто брал дату из" Журнала ". следующий код:

  • Я использовал вспомогательный столбец в «чек выпущен», где можно ввести дату.
  • Сценарий onEdit (e) обнаруживает новое значение, находит эквивалентстрока в «Журнале».
  • Сценарий обновляет столбец «Дата» в «Журнале» - в этот момент значения в «проверке освобождены» автоматически обновляются.
  • Затем скрипт удаляетзначение в столбце помощника.

Соответствие от "Журнал" до "проверка освобождена"

Соответствие строк из "проверка освобождена" в "Журнал"опирается на несколько элементов:

  1. Нет recoУ rd действительно уникальный идентификатор.
  2. Однако значения номеров заданий, чертежей и счетов-фактур, когда каждое из них преобразуется в строку и объединяются, генерируют уникальное значение, которое можно использовать для сравнения значений из «Журнал» и «проверка деблокирования».
  3. Значения в «Журнале» обрабатываются в цикле для создания одномерного массива объединенных значений.
  4. Объекты событий предоставляют отредактированную строку в «проверке освобожден»;и значения Job, Draw и Invoice в этой строке объединяются.
  5. Используя метод Javascript indexOf , сценарий "находит" строку в "Log", которая соответствует уникальному объединенному значению изотредактированный ряд.

Другие примечания:

  • фактический размер диапазона данных в «Журнале» и «проверке снят» определяется с помощью getlastRow()
  • getRange и getValues запускаются по одному разу для «Журнал» и «Выпуск проверен»
  • Значения имен переменных выбраны в соответствии с их назначением;это помогает в чтении и понимании кода.

function onEdit(e) {
  // 5824330602
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ui = SpreadsheetApp.getUi();
  var logsheet = "Log";
  var log = ss.getSheetByName(logsheet);
  var checkrsheet = "check released";
  var checkr = ss.getSheetByName(checkrsheet);


  // get Log data
  var logFR = 2;
  var logLR = log.getLastRow();
  var logLC = 4;
  var logRange = log.getRange(logFR,1,logLR-logFR+1,logLC);
  // Logger.log(logRange.getA1Notation());// DEBUG
  var logValues = logRange.getValues();


  // get check released data
  var checkrRange = checkr.getRange(logFR,1,logLR-logFR+1,logLC);
  //Logger.log(checkrRange.getA1Notation());
  var checkrValues = checkrRange.getValues();


  // build array of uniquelogitems
  var logitems=[];
  for (var i=0; i<logValues.length; i++) {
    var logjob = logValues[i][0].toString();
    var logdraw = logValues[i][1].toString();
    var loginv = logValues[i][2].toString();
    var logid = logjob+logdraw+loginv;
    //Logger.log("DEBUG: LOG: Job= "+logjob);
    //Logger.log("DEBUG: LOG: draw= "+logdraw);
    //Logger.log("DEBUG: LOG: inv= "+loginv);
    //Logger.log("DEBUG: LOG: concat= "+logid);
    var logid = logjob+logdraw+loginv;
    logitems.push(logid);
  }
  //Logger.log(logitems); //DEBUG


  // get the event objects
  var editedRow = e.range.getRow();
  var editedCol = e.range.getColumn();
  var editedSheet = e.range.getSheet().getSheetName();
  var editedValue = e.value;
  // Logger.log("DEBUG: row = "+editedRow+", column = "+editedCol+", Sheet = "+editedSheet)


  // apply logic to test whether this edit should be processed
  // Column 5 ("E") is the helper column
  if(editedRow >= logFR && editedRow <=logLR && editedCol === 5 && editedSheet === checkrsheet){
    // the edit is in Column E (Date), between the first and last rows of data, on the "check released" sheet
    //Logger.log("DEBUG: edit is OK. edit row = "+editedRow+". Keep processing");

    var checkrjob = checkrValues[editedRow-2][0].toString();
    var checkrdraw = checkrValues[editedRow-2][1].toString();
    var checkrinv = checkrValues[editedRow-2][2].toString();
    var checkritem = checkrjob+checkrdraw+checkrinv;
    //Logger.log("DEBUG: Checkr: job="+checkrjob+", draw= "+checkrdraw+", inv = "+checkrinv+", Item = "+checkritem);
    var match = logitems.indexOf(checkritem);
    //Logger.log("DEBUG: Matching row = "+match);

    // get the existing date
    var existingdate = logValues[+match+1][3];
    var cell = log.getRange(+match+2,4);
    //Logger.log("DEBUG: the update cell = "+cell.getA1Notation())


    // date field is a date, so update new date
    cell.setValue(editedValue);
    cell.setNumberFormat('mm/dd/yy');
    e.range.clearContent();

    //Logger.log("DEBUG: updated date on Log")
  }
  else{
    // the edit didn't meet the rule
    //Logger.log("DEBUG: edit did NOT meet criteria. Do not proceed")
  }

};

Столбец E - вспомогательный столбец

Screenshot

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