Я работаю над листом времени / времени в 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()
.