在一个电子表格上使用onEdit触发器在另一个电子表格上设置值

时间:2019-05-14 00:20:27

标签: google-apps-script google-sheets

我一直在使用脚本对Google工作表进行超时/超时处理。我最初的问题是如何与用户共享工作表(我们称其为客户),客户可以在其中编辑具有onEdit触发器的工作表,然后将其设置为另一个客户没有权限使用的工作表中的值。

我首先尝试仅共享一个电子表格,然后锁定该电子表格中的工作表之一。但这会阻止触发器在客户端使用时正确运行。所以我问了一下,有人建议在客户端工作表上使用可安装的编辑触发器。并将信息附加到新的电子表格中。但是,我认为这不是我想要的,因为代码的工作方式需要客户端无法编辑将要附加的信息,不是因为我不需要虚假信息,而是因为如果他们摆脱了错误信息,某些列,脚本不知道该怎么办。 但这确实给了我一个主意,而不是拥有一个包含两张工作表的电子表格,而只有两个包含1张工作表的电子表格。与使用客户帐户在打开的电子表格中查找工作表相比,使用客户帐户的人查找共享电子表格的可能性要小得多。

现在向您展示一些代码。抱歉,由于我看不到的任何小错误,我必须全部显示。

主机电子表格ID是正在登录信息的电子表格的ID。这是我不想由客户端编辑的信息。 活动是指客户端单击并编辑的工作表的名称。 PASSIVE表示正在收集信息的工作表的名称。最初,这两个工作表位于同一电子表格中。

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)
} 
}

因此,这是我尝试将以前在同一电子表格中的两张纸变成两张不同的电子表格。但是,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 |  

您会看到Sarah Smith两次打开而没有登录。这是由于我如何获取被动行而导致的错误,现在它看到2行,其中“ IN”为空,因此函数findRows()会给我setValue()函数内的函数timeIn()中只有2个值。

0 个答案:

没有答案