Google文档脚本:将单元格移动到其他两个页面上,但没有重复

时间:2017-02-14 00:51:23

标签: javascript google-apps-script google-sheets spreadsheet

我知道Google Sheet公式很好但不是脚本。

我从堆栈溢出中借了一些elses代码,修补了,并且错误地失败了。

基本上,我要做的是当我在1页中的A列中的单元格中输入文本时,我希望它将该文本移动到下一个可用的文本,或者将其中的文本移动到另外两个文本中表,两列都是。我还需要它来检查重复项,如果文本与另一个单元完全匹配,则根本不将文本添加到该表。

这是我一直在修补的代码。

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

这个脚本有时会将我的单元格移动到两张纸上,有时它会将它添加到一张纸上,有时它会将单元格两次添加到同一张纸上,有时它会删除原始单元格并且不会对其执行任何操作。

另外,我真的不喜欢在AA栏中输入“y”来移动它,最大的问题是它也将AA列移动到其他纸张上,这在某些时候会是个大问题。

此脚本也不检查重复项。有一个Google表格数据验证功能可以做到这一点,但出于某种原因,到目前为止,当与脚本结合使用时,它充其量只是参差不齐,而且实际上并没有95%的时间都能正常工作。

这是我的电子表格的副本,它是为任何有链接可以编辑的人设置的。我不认为这个剧本需要它,但随便看看我在做什么,因为它是一个副本,我不介意它破坏。

更新链接(2017年3月1日)

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

我是一个贸易的狗美容师所以这个脚本不是我的一杯茶,谷歌表公式只是一个业余爱好和游戏当然。 :)

修改(2017年3月1日)

以下是我的新脚本。我添加了几个新工作表,脚本工作正常。我还更新了上述电子表格链接,以再次包含具有完全编辑权限的新副本。

我确实有一个新问题。如何撤消此操作?例如,假设我要添加一个名为“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
 }

1 个答案:

答案 0 :(得分:0)

这应该可以解决问题:

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
}

你是在正确的轨道上,只是添加了一个名为删除重复项的功能,以便在输入这两个表中的值之前检查重复项。但是请注意,我只检查带有来自InputVPData的数据的重复项。如果您愿意,可以对InputSoulData表执行相同的操作。

编辑:如何在第二张表中查找重复项。诀窍在于这些代码:

        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)

这段代码的作用是获取名为“InputVPData”的工作表,然后找出有数据的lastrow。然后通过使用:

获取第8行到第8行的第1列中的所有值
 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

同样,我们使用r.getValues()获取输入数据的值并将其传递给此函数

removeDuplicates(r.getValues(),targetMembers)

从输入的数据中删除重复项(r.getValues)并将其返回到变量newMembers,就像这样

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

然后使用setValues函数将此新成员添加到targetSheet,如下所示:

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

您需要做的就是复制上面的代码,以便在r.getValues和targetSheet2成员上使用removeduplicates函数后获取一组新的newMembers2。 再次获取该列表后,使用setValues从变量newMembers2中设置新工作表中的值。