Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript GoogleDocs脚本:将单元格移动到其他两个工作表OneEdit,但不能重复_Javascript_Google Apps Script_Google Sheets_Spreadsheet - Fatal编程技术网

Javascript GoogleDocs脚本:将单元格移动到其他两个工作表OneEdit,但不能重复

Javascript GoogleDocs脚本:将单元格移动到其他两个工作表OneEdit,但不能重复,javascript,google-apps-script,google-sheets,spreadsheet,Javascript,Google Apps Script,Google Sheets,Spreadsheet,我很熟悉谷歌表单公式,但不懂脚本 我从堆栈溢出中借用了其他人的代码,进行了修补,但失败了 基本上,我要做的是,当我在一张工作表的a列中的一个单元格中键入文本时,我希望它将该文本移动到下一个可用的单元格中,或者在另外两张工作表中(从最后一行开始(+1),两张工作表都是列。我还需要它来检查重复,如果文本与另一个单元格完全匹配,则根本不向该工作表添加文本 这是我一直在修补的代码 function onEdit(event) { var ss = SpreadsheetApp.getActiveSpr

我很熟悉谷歌表单公式,但不懂脚本

我从堆栈溢出中借用了其他人的代码,进行了修补,但失败了

基本上,我要做的是,当我在一张工作表的a列中的一个单元格中键入文本时,我希望它将该文本移动到下一个可用的单元格中,或者在另外两张工作表中(从最后一行开始(+1),两张工作表都是列。我还需要它来检查重复,如果文本与另一个单元格完全匹配,则根本不向该工作表添加文本

这是我一直在修补的代码

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 Sheet数据验证功能可以做到这一点,但由于某种原因,到目前为止,当与脚本结合使用时,它充其量是零碎的,实际上95%的时间都无法工作

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

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

我是一名专业的狗美容师,所以这种脚本不是我喜欢的,当然,谷歌表单公式只是一种爱好,当然还有游戏。:)

编辑:(2017年3月1日)

下面是我的新剧本。我已经添加了几个新的工作表和脚本是完美的工作。我还更新了上面的电子表格链接,再次包含一份具有完整编辑权限的新副本

不过我有一个新问题。我该如何着手解决这个问题?例如,假设我要添加一个名为“RemoveMember”的新工作表

函数onEdit(事件){
var ss=SpreadsheetApp.getActiveSpreadsheet();
/*var s=event.source.getActiveSheet();
var r=event.source.getActiveRange()*/
//使用event.source没有错,使用下面的代码调试更容易。
var s=ss.getActiveSheet()
var r=ss.getActiveRange()
//您以前的代码检查列AA的原因是由于以下代码r.getColumn()==27和r.getValue()==y
如果(s.getName()==“AddMember”&&r.getColumn()==1){
var targetSheet=ss.getSheetByName(“InputVPData”);
var tlastRow=targetSheet.getLastRow()
//targetMembers获取inputVpData中以前的成员
var targetMembers=targetSheet.getRange(8,1,tlastRow-7,1).getValues()
//如果发现任何重复项,RemoveDuplicates将删除。
var newMembers=removeDuplicates(r.getValues(),targetMembers)
//在输入数据之前,检查并查看是否有任何新条目
//重要信息,因为getRange不能将0作为参数。
如果(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、 清除()
}
}
功能移除副本(新成员、目标成员){
var uniqueMembers=[]
变量计数器=0
for(var i=0;i
这应该可以做到:

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”的工作表,然后找出包含数据的最后一行。然后使用以下命令获取第1列中从第8行到最后一行-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
类似地,我们使用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成员上使用RemovedUpplicates函数后,只需复制上述代码即可获得一组新成员2。
一旦您再次获得该列表,请使用setValues从变量newMembers2在新工作表中设置值。

Bah,它不会让我勾选您的响应。我对脚本一无所知。我借用了别人的代码,并逐渐从中获得了一些东西。。如何在InputSoulData工作表中检查重复项。。。英雄联盟对不起,我不太清楚。。如果今晚我有更多的时间,我会一直盯着它直到它有意义。。。LolI将编辑答案,让您在
 var newMembers = removeDuplicates(r.getValues(),targetMembers)
targetSheet.getRange(tlastRow + 1, 1,newMembers.length, 1).setValues(newMembers);