0

我知道Google Sheet公式很好,但不是脚本。谷歌文档脚本:将单元格移动到其他两张onEdit,但没有重复

我借用了一些elses代码从堆栈溢出,修补,并失败失败。

基本上,我想要做的是当我在1页的列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表格数据验证功能可以执行此操作,但由于某种原因,迄今为止,当与脚本结合使用时,它最多只有几个点,实际上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 
} 

回答

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行,直到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 

同样,我们得到输入的数据使用r.getValues()的值,并将它传递给这个函数

removeDuplicates(r.getValues(),targetMembers) 

其去除从所述输入的数据(r.getValues)重复,并将其返回到可变newMembers,像这样

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

这newMember是然后使用setValu添加到你的targetSheet ES功能,像这样:

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

所有你需要做的就是重复上面的代码中使用的r.getValues和targetSheet2成员removeduplicates功能后得到一组新的newMembers2的。 一旦您再次获得该列表,请使用setValues在变量newMembers2的新工作表中设置值。

+0

嗯,它不会让我打勾你的回应。我对脚本一无所知。我借用了一些elses代码,并逐渐从中得到了一些东西..我怎么也检查InputSoulData表中的重复项...大声笑..对不起,它不是我清楚..如果我有更多的时间今晚,我会盯着,直到它变得有意义...大声笑 –

+0

我会编辑答案,指出你在正确的方向,但我仍然会让你弄明白。最好不要跌倒。 –

+0

编辑了答案,以便您可以弄清楚如何修改您的代码。 PS:如果你保持你的googleSheet链接分享,我会给你输入你修改你的代码:) –

相关问题