简体   繁体   English

Google文档脚本:将单元格移至onEdit上的其他两个工作表,但没有重复项

[英]Google Docs Script: Move cell to two other sheets onEdit but no duplicates

I know Google Sheet formulas pretty well but not scripting. 我知道Google表格的公式很好,但脚本却不知道。

I borrowed someone elses code from stack overflow, tinkered, and failed misserably. 我从堆栈溢出中借用了别人的代码,进行了修补,但失败了。

Basically, what I am trying to do is when I type text into a cell in column A in 1 sheet, i want it to move that text to the next available, or (+1 from the last row) in two other sheets, both column As. 基本上,我想做的是将文本输入1张纸的A列中的单元格中时,我希望它将文本移到下一个可用的文本中,或者将其移动到其他两张纸中的(从最后一行+1)中,列为 I also need it to check for duplicates and not add the text to that sheet at all if the text exactly matches another cell. 我还需要它来检查重复项,如果文本与另一个单元格完全匹配,则根本不将文本添加到该工作表中。

Here is the code I have been tinkering with. 这是我一直在修改的代码。

function onEdit(event) {

var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = event.source.getActiveSheet();
var r = event.source.getActiveRange();

if(s.getName() == "AddMember" && r.getColumn() == 27 && r.getValue() == "y") {

var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("InputVPData");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);

s.getRange(row, 1, 1, numColumns).copyTo(target);

var targetSheet2 = ss.getSheetByName("InputSoulData");
var target = targetSheet2.getRange(targetSheet2.getLastRow() + 1, 1);

s.getRange(row, 1, 1, numColumns).copyTo(target);
s.deleteRow(row); 
}
}

This script sometimes moves my cell to both sheets, sometimes it adds it to just one sheet, sometimes it adds the cell twice to the same sheet, and sometimes it just deletes my original cell and doesn't do anything with it. 该脚本有时将我的单元格移动到两张纸上,有时将其添加到一张纸上,有时将其两次添加到同一张纸上,有时只删除我原来的单元格而对其不做任何事情。

Additionally, I don't really like having to type "y" in the AA column to move it, the biggest problem with this is that it also moves the AA column to the other sheets as well, which at some point will be a huge problem. 另外,我真的不喜欢必须在AA列中输入“ y”来移动它,最大的问题是它也将AA列也移到了其他工作表上,这有时会很大问题。

This script also does not check for duplicates. 此脚本也不会检查重复项。 There is a Google Sheet Data Validation feature that can do this, but for some reason, so far, when combined with scripting, it is spotty at best, and doesn't actually work 95% of the time. 有一个Google Sheet Data Validation功能可以做到这一点,但是由于某种原因,到目前为止,当与脚本结合使用时,它充其量是杂乱无章的,实际上95%的时间都无法正常工作。

Here is a copy of my Spreadsheet, it is set for anyone with link can edit. 这是我的电子表格的副本,它是为具有链接可以编辑的任何人设置的。 I do not think it is needed for this script, but feel free to see what I am working with and since it is a copy, I don't mind it breaking. 我认为此脚本不是必需的,但是可以随时查看我正在使用的内容,并且由于它是一个副本,因此我不介意它会损坏。

Updated Link (March 1st 2017) 更新的链接 (2017年3月1日)

https://docs.google.com/spreadsheets/d/1u09DNmuotLTHMaF29sbPMrd_k-oRbRB7JGp4pWNgvfI/edit?usp=drivesdk https://docs.google.com/spreadsheets/d/1u09DNmuotLTHMaF29sbPMrd_k-oRbRB7JGp4pWNgvfI/edit?usp=drivesdk

I am a dog groomer by trade so this scripting is not my cup of tea, and google sheet formulas are just a hobby along with gaming of course. 我从行业上讲是个狗美容师,因此此脚本不是我的功课,并且Google表格公式只是游戏的一种业余爱好。 :) :)

Edit: (March 1st 2017) 编辑: (2017年3月1日)

Below is my new script. 以下是我的新脚本。 I have added several new sheets and the script is working perfectly. 我添加了几个新的工作表,脚本运行良好。 I have also updated the above spreadsheet link to again include a new copy with full editing rights. 我还更新了上面的电子表格链接,使其再次包含具有完全编辑权限的新副本。

I do have a new question though. 我确实有一个新问题。 How do I go about undoing this? 我要如何取消呢? For instance, lets say I was to add a new sheet named "RemoveMember"? 例如,假设我要添加一个名为“ RemoveMember”的新工作表?

function onEdit(event) {

 var ss = SpreadsheetApp.getActiveSpreadsheet();

 /*var s = event.source.getActiveSheet();
 var r = event.source.getActiveRange();*/
 // Nothing wrong with using event.source, It is easier to debug with the below code.
 var s = ss.getActiveSheet()
 var r = ss.getActiveRange()

 // The reason your previous code was checking for column AA was due to the following code r.getColumn() == 27 and r.getValue() == 'y'
 if(s.getName() == "AddMember" && r.getColumn() == 1) {
 var targetSheet = ss.getSheetByName("InputVPData");
 var tlastRow = targetSheet.getLastRow()
 // targetMembers gets the previous members you have in the inputVpData 
 var targetMembers = targetSheet.getRange(8,1,tlastRow - 7,1).getValues()
 //RemoveDuplicates removes if any duplicates are found.
 var newMembers = removeDuplicates(r.getValues(),targetMembers)
 //check and see if you have any new entry before entering the data
 //important because getRange cannot have 0 as argument.
 if(newMembers.length != 0){
  targetSheet.getRange(tlastRow + 1, 1,newMembers.length, 1).setValues(newMembers);

  var targetSheet2 = ss.getSheetByName("InputSoulData");
  tlastRow = targetSheet2.getLastRow()

  targetSheet2.getRange(tlastRow + 1, 1,newMembers.length, 1).setValues(newMembers);

  var targetSheet3 = ss.getSheetByName("InputDonatedData");
  tlastRow = targetSheet3.getLastRow()

  targetSheet3.getRange(tlastRow + 1, 1,newMembers.length, 1).setValues(newMembers);

  var targetSheet4 = ss.getSheetByName("InputWonData");
  tlastRow = targetSheet4.getLastRow()

  targetSheet4.getRange(tlastRow + 1, 1,newMembers.length, 1).setValues(newMembers);

  var targetSheet5 = ss.getSheetByName("InputCapturedData");
  tlastRow = targetSheet5.getLastRow()

  targetSheet5.getRange(tlastRow + 1, 1,newMembers.length, 1).setValues(newMembers);

  var targetSheet6 = ss.getSheetByName("InputDefendedData");
  tlastRow = targetSheet6.getLastRow()

  targetSheet6.getRange(tlastRow + 1, 1,newMembers.length, 1).setValues(newMembers);

  var targetSheet7 = ss.getSheetByName("InputLostData");
  tlastRow = targetSheet7.getLastRow()

  targetSheet7.getRange(tlastRow + 1, 1,newMembers.length, 1).setValues(newMembers);
}

r.clear()

}

}


function removeDuplicates(newMembers, targetMembers){
 var uniqueMembers = []

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

var isunique = true;
for(var j=0 ; j < targetMembers.length; j++) {
  if(newMembers[i][0].trim() == targetMembers[j][0].trim())
  {

   isunique = false;
  }
}
  if(isunique){
  uniqueMembers[counter] = []
  uniqueMembers[counter][0] = newMembers[i][0]
  counter++
  }


 }
 return uniqueMembers
 }

This should do the trick: 这应该可以解决问题:

function onEdit(event) {

  var ss = SpreadsheetApp.getActiveSpreadsheet();

  /*var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();*/
   // Nothing wrong with using event.source, It is easier to debug with the below code.
   var s = ss.getActiveSheet()
   var r = ss.getActiveRange()

  // The reason your previous code was checking for column AA was due to the following code r.getColumn() == 27 and r.getValue() == 'y'
  if(s.getName() == "AddMember" && r.getColumn() == 1) {
    var targetSheet = ss.getSheetByName("InputVPData");
    var tlastRow = targetSheet.getLastRow()
    // targetMembers gets the previous members you have in the inputVpData 
    var targetMembers = targetSheet.getRange(8,1,tlastRow - 7,1).getValues()
    //RemoveDuplicates removes if any duplicates are found.
    var newMembers = removeDuplicates(r.getValues(),targetMembers)
    //check and see if you have any new entry before entering the data
    //important because getRange cannot have 0 as argument.
    if(newMembers.length != 0){
      targetSheet.getRange(tlastRow + 1, 1,newMembers.length, 1).setValues(newMembers);

      var targetSheet2 = ss.getSheetByName("InputSoulData");
      tlastRow = targetSheet2.getLastRow()

      targetSheet2.getRange(tlastRow + 1, 1,newMembers.length, 1).setValues(newMembers);
    }

    r.clear()

  }

}


function removeDuplicates(newMembers, targetMembers){
  var uniqueMembers = []

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

    var isunique = true;
    for(var j=0 ; j < targetMembers.length; j++) {
      if(newMembers[i][0].trim() == targetMembers[j][0].trim())
      {

       isunique = false;
      }
    }
      if(isunique){
      uniqueMembers[counter] = []
      uniqueMembers[counter][0] = newMembers[i][0]
      counter++
      }


  }
  return uniqueMembers
}

You were on the right track, just added a function called remove Duplicates to check for duplicates before entering the value in those two sheets. 您处在正确的轨道上,只是添加了一个名为remove Duplicates的功能,以在输入这两张纸中的值之前检查重复项。 However note, I only check for duplicates with the data from InputVPData. 但是请注意,我仅检查InputVPData中的数据是否重复。 You can do the same for InputSoulData sheet if you like. 如果愿意,可以对InputSoulData表执行相同的操作。

Edit: How to look for duplicates in the second sheet. 编辑:如何在第二张纸中查找重复项。 The trick lies in these code: 诀窍在于这些代码:

        var targetSheet = ss.getSheetByName("InputVPData");
        var tlastRow = targetSheet.getLastRow()
        // targetMembers gets the previous members you have in the inputVpData 
        var targetMembers = targetSheet.getRange(8,1,tlastRow - 7,1).getValues()
        //RemoveDuplicates removes if any duplicates are found.
        var newMembers = removeDuplicates(r.getValues(),targetMembers)

what this code does is gets the sheet called "InputVPData" and then figure out the lastrow which has data. 该代码的作用是获取名为“ InputVPData”的工作表,然后找出包含数据的最后一行。 Then gets the all the values in column one from row 8 till lastrow - 7 by using this: 然后使用以下方法从第8行到lastrow-7获取第一列中的所有值:

 var targetMembers = targetSheet.getRange(8,1,tlastRow - 7,1).getValues()
 getRange(StartRow,StartColumn,NoofRows,noOfColumns)=> Get the range
 getValues() => Get the value of said range

Similarly, we get the value of entered data using r.getValues() and pass it to this function 同样,我们使用r.getValues()获取输入数据的值,并将其传递给此函数

removeDuplicates(r.getValues(),targetMembers)

which removes duplicates from the entered data (r.getValues) and returns it to the variable newMembers, like so 它从输入的数据(r.getValues)中删除重复项,并将其返回给变量newMembers,如下所示

 var newMembers = removeDuplicates(r.getValues(),targetMembers)

this newMember is then added to your targetSheet using the setValues function like so: 然后使用setValues函数将该newMember添加到您的targetSheet中,如下所示:

targetSheet.getRange(tlastRow + 1, 1,newMembers.length, 1).setValues(newMembers);

All you need to do is duplicate the above code to get a new set of newMembers2 after using the removeduplicates function on r.getValues and targetSheet2 members. 您需要做的就是在r.getValues和targetSheet2成员上使用removedplicates函数后,复制以上代码以获取新的newMembers2集。 Once you get that list once again use setValues to set values in the new sheet from the variable newMembers2. 一旦获得该列表,请再次使用setValues从变量newMembers2设置新工作表中的值。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM