Использование триггера onEdit в одной электронной таблице для установки значений в другой электронной таблице - PullRequest
1 голос
/ 14 мая 2019

Я работаю над листом времени / времени в Google с помощью скрипта.Мой первоначальный вопрос заключался в том, как поделиться листом с пользователем (назовем его клиентом), где клиент может редактировать лист с триггером onEdit, который затем устанавливает значения в другой лист, на который у клиента не было разрешения.

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

Так что теперь, чтобы показать вам некоторый код.Извините, я чувствую, что должен показать все это из-за какой-то мелочи, которая может быть неправильной.

Идентификатор электронной таблицы хоста - это идентификатор электронной таблицы, в которую вводится информация.Это информация, которую я не хочу редактировать клиентом.ACTIVE относится к названию листа, на котором клиент нажимает и редактирует.ПАССИВ относится к названию листа, который собирает информацию.Первоначально эти два листа были в одной таблице.

function setValue(cellName, value) {
   SpreadsheetApp.getActiveSpreadsheet().getRange(cellName).setValue(value);
}

function getCurrentRow() {
  var currentRow = SpreadsheetApp.getActiveSheet().getActiveSelection().getRowIndex();
  return currentRow;
}


function getValue(cellName) {
  return SpreadsheetApp.getActiveSpreadsheet().getRange(cellName).getValue()
}

function getNextRow() {
  var sas = SpreadsheetApp.openById("Host Spreadsheet Id");
  var ss = SpreadsheetApp.setActiveSpreadsheet(sas)
  return SpreadsheetApp.getActiveSpreadsheet().getSheetByName('PASSIVE').getLastRow() +1;

}
function getLasttRow() {
  var sas = SpreadsheetApp.openById("Host Spreadsheet Id");
  var ss = SpreadsheetApp.setActiveSpreadsheet(sas)
  return SpreadsheetApp.getActiveSpreadsheet().getSheetByName('PASSIVE').getLastRow();
}

function addRecord(a, b, c, d) {
      var sas = SpreadsheetApp.openById("Host Spreadsheet Id");
 SpreadsheetApp.setActiveSpreadsheet(sas)
  var row = getNextRow();
  setValue('PASSIVE!A' + row, a);
  setValue('PASSIVE!B' + row, b);
  setValue('PASSIVE!C' + row, c);
  setValue('PASSIVE!D' + row, d);
}
/// this function is to find the row number(s) that match the criteria in
/// the timeIn() function so that the time in date can be placed 
/// directly to the right of the individual that signed out.
function findRows(c1,n1,c2,n2,c3,n3,name) {
  var sas = SpreadsheetApp.openById("Host Spreadsheet Id")
SpreadsheetApp.setActiveSpreadsheet(sas)
  var ss=SpreadsheetApp.getActiveSpreadsheet()
  var sh=ss.getSheetByName(name);
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var rA=[];
  for(var i=0;i<vA.length;i++) {
    if(vA[i][c1-1]==n1 && vA[i][c2-1]==n2 && vA[i][c3-1]==n3) {
      rA.push(i+1);
    }
  }
  return rA
}

function timeIn() {
  var row = getCurrentRow()
   var LocationA = getValue('ACTIVE!A' + row)
   var LocationB = getValue('ACTIVE!B' + row)
  var passiveRow = findRows(1,LocationA,2,LocationB,5,"",'PASSIVE');
  Logger.log(passiveRow);
  setValue('PASSIVE!E' + passiveRow, new Date().toLocaleString());
}

function places() {
   var row = getCurrentRow()
  addRecord(getValue('A' + row), getValue('B' + row), getValue('C' + row), new Date().toLocaleString());
}

function onEdit(e) {
   var row = getCurrentRow()
   var Location = getValue('ACTIVE!C' + row)
   var LocationA = getValue('ACTIVE!A' + row)
   var LocationB = getValue('ACTIVE!B' + row)
  var passiveRow = findRows(1,LocationA,2,LocationB,5,"",'PASSIVE');
  Logger.log(row)
  Logger.log(Location)
  Logger.log(LocationA)
  Logger.log(LocationB)
  Logger.log(passiveRow)
   if(SpreadsheetApp.getActiveSheet().getName() !== "ACTIVE") return;
  if(Location !== 'HOME' && Location !== ""  && passiveRow == "") {
    places();
    Logger.log(passiveRow)
  }
 else if(Location !== 'HOME' && Location !== ""  && passiveRow !== "") {
    timeIn();
    places();
    Logger.log(passiveRow)

  }

  else if(Location === 'HOME' && passiveRow !== "") {
    timeIn(); 
    Logger.log(passiveRow)
} 
}

Итак, это была моя попытка превратить то, что раньше было 2 листа в одной и той же таблице, в 2 разные таблицы.Однако функция onEdit(e) не работает.Если я вручную запускаю функцию timeIn(), она работает и функция places() также работает.Даже идет и находит последнюю строку таблицы, в которую он импортирует информацию.Но, увы, когда они редактируют столбец C, столбец, который должен активировать onEdit(e), если он еще работает, он не запускает функции.Чего мне не хватает?

Позвольте мне дать некоторые наглядные снимки того, что я пытаюсь сделать.Вот лист, который должны увидеть клиенты.Столбец C имеет выпадающие списки в каждом ряду, полном мест.

  First  |   Last    | LOCATIONS
=================================
James    |   Carter  | HOME
Kyle     |  Johnson  | MALL
Micheal  |   Wilson  | BANK
Sarah    |   Smith   | HOME
Tray     |    Tin    | CLINIC
John     |   Becks   | HOME

Вот лист, собранный Таблицей хостов

  First  |   Last    | LOCATION |  OUT   |   IN
=====================================================
Tray     |    Tin    | CLINIC   |  10:00 |
James    |   Carter  | MALL     |  12:30 |  1:30
Kyle     |  Johnson  | MALL     |  12:45 |
Micheal  |   Wilson  | BANK     |  01:00 |
James    |   Carter  | POOL     |  01:30 |  2:00

Я надеюсь, что это достаточно хороший визуальный материал, чтобы понять, что я пытаюсь достичь,Код работал на той же электронной таблице, но теперь я пытаюсь заставить его работать на двух, чтобы клиент не связывался с собранной информацией.Потому что, если что-то подобное происходит:

  First  |   Last    | LOCATION |  OUT   |   IN
=====================================================
Tray     |    Tin    | CLINIC   |  10:00 |
James    |   Carter  | MALL     |  12:30 |  1:30
Kyle     |  Johnson  | MALL     |  12:45 |
Micheal  |   Wilson  | BANK     |  01:00 |
James    |   Carter  | POOL     |  01:30 |  2:00
Sarah    |   Smith   | POOL     |  01:30 |  
Sarah    |   Smith   | POOL     |  01:31 |  

Вы видите, что Сара Смит дважды включена без входа. Это вызывает ошибку из-за того, как я получаю пассивные строки, теперь она видит 2 строки, где "IN"пусто, поэтому функция findRows() дает 2 значения, в которых я могу иметь только 1 значение в функции setValue() внутри функции timeIn().

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