Улучшите GS Script для обновления значений определенных столбцов на другой лист (конкретные столбцы), если идентификатор строки совпадает на обоих листах

  1. В сценарии GS я пытаюсь обновить значения из листа «Заработная плата» в лист «Журнал».
  2. На основании критериев, если лист заработной платы A3:A совпадает с листом журнала A2:A в ведомости заработной платы первые 2 строки являются заголовками, а в ведомости первая строка является заголовком.
  3. Только указанные столбцы/ячейки должны быть обновлены.
  4. данный пример кода работает, но ОЧЕНЬ МЕДЛЕННО.
function updateLogSheet() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var payrollSheet = ss.getSheetByName("Payroll");
  var logSheet = ss.getSheetByName("Log");

  // Get the Emp.code from A1 of the Payroll sheet
  var empCode = payrollSheet.getRange("A1").getValue();

  // Get the values in the Date list from A3:A of the Payroll sheet
  var logIds = payrollSheet.getRange("A3:A").getValues().flat().filter(Boolean);

  var logValues = logSheet.getRange("A2:AH").getValues();
  logValues = logValues.filter(function (x) {
    return !(x.every(element => element === (undefined || null || '')))
  });

  for (var i = 0; i < logValues.length; i++) {

    for (var j = 0; j < logIds.length; j++) {
      if (logIds[j] === logValues[i][0]) {
        var payrollIndex = j + 3;
        if (logValues[i][2] == empCode && payrollIndex !== -1) {
          var rowIndex = i + 2; // Add 2 because the range starts at A2
          if (rowIndex != -1) {
            // Update the cells in the Log sheet
            logSheet.getRange(rowIndex, 2).setValue(payrollSheet.getRange("B" + payrollIndex).getValue()); // Date

            logSheet.getRange(rowIndex, 28).setValue(payrollSheet.getRange("AB" + payrollIndex).getValue()); // + symbol
           
            logSheet.getRange(rowIndex, 31).setValue(payrollSheet.getRange("AE" + payrollIndex).getValue()); // empty        
            
            logSheet.getRange(rowIndex, 34).setValue(payrollSheet.getRange("AH" + payrollIndex).getValue()); // Manual Hrs Adjust        

            logSheet.getRange(rowIndex, 7).setValue(payrollSheet.getRange("G" + payrollIndex).getValue()); // 1st ClockIN TIME 
            logSheet.getRange(rowIndex, 8).setValue(payrollSheet.getRange("H" + payrollIndex).getValue()); // 1-IN-Loc
            logSheet.getRange(rowIndex, 9).setValue(payrollSheet.getRange("I" + payrollIndex).getValue()); // 1-Activity
            logSheet.getRange(rowIndex, 11).setValue(payrollSheet.getRange("J" + payrollIndex).getValue()); // 1-Project         
            logSheet.getRange(rowIndex, 13).setValue(payrollSheet.getRange("K" + payrollIndex).getValue()); // 1-Note

            logSheet.getRange(rowIndex, 23).setValue(payrollSheet.getRange("L" + payrollIndex).getValue()); // 2-IN-TIME
            logSheet.getRange(rowIndex, 24).setValue(payrollSheet.getRange("M" + payrollIndex).getValue()); // 2-IN-Loc
            logSheet.getRange(rowIndex, 25).setValue(payrollSheet.getRange("N" + payrollIndex).getValue()); // 2-Activity
        logSheet.getRange(rowIndex, 27).setValue(payrollSheet.getRange("O" + payrollIndex).getValue()); // 2-Project
        logSheet.getRange(rowIndex, 29).setValue(payrollSheet.getRange("P" + payrollIndex).getValue()); // 2-Note     

        logSheet.getRange(rowIndex, 38).setValue(payrollSheet.getRange("Q" + payrollIndex).getValue()); // 3-IN-TIME        
        logSheet.getRange(rowIndex, 40).setValue(payrollSheet.getRange("R" + payrollIndex).getValue()); // 3-IN-Loc
        logSheet.getRange(rowIndex, 41).setValue(payrollSheet.getRange("S" + payrollIndex).getValue()); // 3-Activity
        logSheet.getRange(rowIndex, 43).setValue(payrollSheet.getRange("T" + payrollIndex).getValue()); // 3-Project
        logSheet.getRange(rowIndex, 44).setValue(payrollSheet.getRange("U" + payrollIndex).getValue()); // 3-Note

        logSheet.getRange(rowIndex, 15).setValue(payrollSheet.getRange("V" + payrollIndex).getValue()); // 1-OUT-TIME        
        logSheet.getRange(rowIndex, 16).setValue(payrollSheet.getRange("W" + payrollIndex).getValue()); // 1-OUT-Loc
        logSheet.getRange(rowIndex, 17).setValue(payrollSheet.getRange("X" + payrollIndex).getValue()); // 1-OUT-Activity
        logSheet.getRange(rowIndex, 21).setValue(payrollSheet.getRange("Y" + payrollIndex).getValue()); // 1-OUT-Note

        logSheet.getRange(rowIndex, 31).setValue(payrollSheet.getRange("Z" + payrollIndex).getValue()); // 2-OUT-TIME
        logSheet.getRange(rowIndex, 32).setValue(payrollSheet.getRange("AA" + payrollIndex).getValue()); // 2-OUT-Loc
        logSheet.getRange(rowIndex, 33).setValue(payrollSheet.getRange("AB" + payrollIndex).getValue()); // 2-OUT-Activity
        logSheet.getRange(rowIndex, 37).setValue(payrollSheet.getRange("AC" + payrollIndex).getValue()); // 2-OUT-Note

        logSheet.getRange(rowIndex, 47).setValue(payrollSheet.getRange("AD" + payrollIndex).getValue()); // 3-OUT-TIME
        logSheet.getRange(rowIndex, 48).setValue(payrollSheet.getRange("AE" + payrollIndex).getValue()); // 3-OUT-Loc
        logSheet.getRange(rowIndex, 49).setValue(payrollSheet.getRange("AF" + payrollIndex).getValue()); // 3-OUT-Activity
        logSheet.getRange(rowIndex, 53).setValue(payrollSheet.getRange("AG" + payrollIndex).getValue()); // 3-OUT-Note

           } 
        }
        payrollIndex = -1;
        break;
      }
    }
  }
}

Прикрепленная ссылка и изображение образца листа для справки

https://docs.google.com/spreadsheets/d/1UiwpNM2S0aeo4QinbEi-NqyPkGFVoZobqareeAOCsHs/edit?usp=sharing

это точные столбцы, которые нужно обновить

Заработная плата в журнал

Б к Б

от г до г

я к Дж

от J до К

от К до М

слева направо

от М до Х

от Н до Я

от О до АА

P к переменному току

Q в AL

Р в АН

от S до АО

Т в АК

от U до AS

от В до О

от W до P

от Х до Q

от Y до U

от Z до АЕ

АА в АФ

от АБ до АГ

АК в АК

из AD в Австралию

АЭ в АВ

АФ в АВ

АГ в БА


Спасибо :)

Хотя я не уверен, правильно ли я понял ваш ожидаемый результат, я предложил модифицированный скрипт в качестве ответа. Пожалуйста, подтвердите это. Если я неправильно понял ваш ожидаемый результат, приношу свои извинения.

Tanaike 04.04.2023 14:29

Спасибо :) работает точно с требованиями 👍👍👍

HummBird 04.04.2023 22:21

И это также быстро. Спасибо :)

HummBird 04.04.2023 22:21

Но одна вещь, которая не соответствует идентификационному коду Payroll (A3: A) = Log (A2: A), затем обновите значение с помощью указанной строки идентификатора.

HummBird 04.04.2023 22:32

👍 В строке const obj = srcValues.reduce((o, e) => (o[e[0]] = e, o), {}); создает объект (obj), где ключами являются значения в первом столбце массива srcValues ​​(который исходит из листа заработной платы), а значения представляют собой целые строки.

HummBird 05.04.2023 04:17

Что касается вашего нового выпуска In the line const obj = srcValues.reduce((o, e) => (o[e[0]] = e, o), {});, it creates an object (obj) where the keys are the values in the first column of the srcValues array (which comes from the Payroll sheet), and the values are the entire rows., я должен извиниться за свое плохое знание английского языка. К сожалению, я не могу понять вашу новую проблему. Но, я хотел бы поддержать вас. Итак, могу я спросить вас о деталях вашего нового выпуска? Под этим я хотел бы попытаться понять это.

Tanaike 05.04.2023 04:19

Спасибо за вопрос. Просто хочу знать, что данный модифицированный скрипт проверяет, совпадает ли платежная ведомость (A3:A) с журналом (A2:A).

HummBird 05.04.2023 04:40

Спасибо за ответ. Насчет Just want to know, that the given modified script checks whether the payroll (A3:A) matches with Log (A2:A)., в предложенном мною скрипте проверяется столбец "А" обоих листов. И лист «Журнал» обновляется путем проверки того же значения столбца «А». Если я неправильно понял ваш ответ, прошу прощения.

Tanaike 05.04.2023 04:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я считаю, что ваша цель заключается в следующем.

  • Вы хотите снизить стоимость обработки вашего сценария.

В таком случае, как насчет следующей модификации?

Модифицированный скрипт:

function sample() {
  // Ref: https://tanaikech.github.io/2022/07/04/converting-a1notation-to-gridrange-and-vice-versa-using-google-apps-script-without-any-scopes/
  const columnLetterToIndex_ = letter => [...letter.toUpperCase()].reduce((c, e, i, a) => (c += (e.charCodeAt(0) - 64) * Math.pow(26, a.length - i - 1)), -1);

  // These values are from your question.
  const conversion = [["B", "B"], ["G", "G"], ["I", "J"], ["J", "K"], ["K", "M"], ["L", "W"], ["M", "X"], ["N", "Y"], ["O", "AA"], ["P", "AC"], ["Q", "AL"], ["R", "AN"], ["S", "AO"], ["T", "AQ"], ["U", "AS"], ["V", "O"], ["W", "P"], ["X", "Q"], ["Y", "U"], ["Z", "AE"], ["AA", "AF"], ["AB", "AG"], ["AC", "AK"], ["AD", "AU"], ["AE", "AV"], ["AF", "AW"], ["AG", "BA"]];

  const converted = conversion.map(e => e.map(f => columnLetterToIndex_(f)));
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const srcSheet = ss.getSheetByName("Payroll");
  const dstSheet = ss.getSheetByName("Log");
  const srcValues = srcSheet.getRange("A3:AG" + srcSheet.getLastRow()).getValues();
  const obj = srcValues.reduce((o, e) => (o[e[0]] = e, o), {});
  const dstRange = dstSheet.getRange("A2:BA" + dstSheet.getLastRow());
  const values = dstRange.getValues().map(e => {
    const ar = obj[e[0]];
    if (ar) {
      converted.forEach(([a, b]) => e[b] = ar[a] || null);
    }
    return e;
  });
  dstRange.setValues(values);
}
  • Когда этот сценарий запускается, создается массив, и созданный массив помещается в целевой лист. Таким образом, я подумал, что стоимость процесса может быть немного снижена.

Примечание:

  • Значения conversion взяты из вашего вопроса. Если вы хотите изменить это, измените значения.

Использованная литература:

Другие вопросы по теме