Скрипт приложения Google - возвращает заголовок столбца таблицы Google активной ячейки и указанное c значение столбца строки, в которой выполнено изменение - PullRequest
0 голосов
/ 26 мая 2020

Я пишу, чтобы найти способы захвата заголовков столбцов Google Sheet и определенного c значения столбца для данной строки.

У меня есть код, в котором я записываю журнал изменений на новый лист. См. Ниже:


// This script records changes to the spreadsheet on a "Changelog" sheet.
// The changelog includes these columns:
// "Timestamp", "Sheet", "Cell", "Type", "Old Value", "New Value", "User"
// Users are logged by email address.
// Source 1: https://productforums.google.com/d/topic/docs/az365_ypIV0
// Source 2: https://productforums.google.com/forum/#!topic/docs/AI9OxbOtvWE
// Source 3: http://eyana.me/create-a-simple-changelog-using-google-apps-scripts

function onEdit(e) {  
  var changelogSheetName = "Changelog";
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var cell = SpreadsheetApp.getActiveRange();
  var timestamp = new Date();
  var currentSheet = ss.getActiveSheet();
  var currentSheetName = currentSheet.getName();
  var HRISmaster = "HRIS Master";
  var previousValue = e.oldValue;
  var newValue = cell.getValue();
  var typeChange = "Change";


  // if it is the changelog sheet that is being edited, do not record the change to avoid recursion
  if (currentSheetName == changelogSheetName || currentSheetName !== HRISmaster) return;
  var changelogSheet = ss.getSheetByName(changelogSheetName);

  if (changelogSheet == null) {

    // no changelog sheet found, create it as the last sheet in the spreadsheet
    changelogSheet = ss.insertSheet(changelogSheetName, ss.getNumSheets());

    Utilities.sleep(2000); // give time for the new sheet to render before going back

    ss.setActiveSheet(currentSheet);    
    changelogSheet.getRange('A1:G1').setBackground('#E0E0E0');
    changelogSheet.appendRow(["Timestamp", "Sheet", "Cell", "Type", "Old Value", "New Value", "User"]);
    changelogSheet.deleteColumns(8,19);
    changelogSheet.setFrozenRows(1);
    changelogSheet.setColumnWidth(1, 170);
    changelogSheet.setColumnWidth(7, 170);
    changelogSheet.protect();
  }


  var user = Session.getEffectiveUser().getEmail();

  if (previousValue == null){
    typeChange = "Set";
  } else if (newValue == "") {
    typeChange = "Unset";  
  }

  changelogSheet.appendRow([timestamp, currentSheetName, cell.getA1Notation(), typeChange, previousValue, newValue, user]);
}

Теперь мне нужно найти выход, чтобы захватить заголовок столбца, а не ссылку на ячейку, в которой сделано изменение, и значение столбца, в котором у меня есть некоторые идентификаторы, хранящиеся на том же листе.

Я подготовил образец листа с фиктивными данными, который в точности совпадает с имеющимися у меня реальными данными. Этот лист можно найти здесь https://docs.google.com/spreadsheets/d/1sMthpSG-7L-uv7XssQ9UO2FU2o385aekEwhHmb9-1Lk/edit?usp=sharing

Я добавил дополнительный лист (Нужен этот тип журнала изменений), который показывает тип журнала изменений, который мне нужен. Может кто-нибудь, пожалуйста, помогите.

С уважением, Сайед Х

1 Ответ

0 голосов
/ 26 мая 2020

Почему бы не извлечь их напрямую, используя местоположение диапазона?

var field = currentSheetName.getRange(1, cell.getColumn()).getValue();
var id = currentSheetName.getRange(cell.getRow(), 1).getValue();

changelogSheet.appendRow([timestamp, field, id, currentSheetName, cell.getA1Notation(), typeChange, previousValue, newValue, user]);
...