Javascript GoogleDocs脚本:将单元格移动到其他两个工作表OneEdit,但不能重复
我很熟悉谷歌表单公式,但不懂脚本 我从堆栈溢出中借用了其他人的代码,进行了修补,但失败了 基本上,我要做的是,当我在一张工作表的a列中的一个单元格中键入文本时,我希望它将该文本移动到下一个可用的单元格中,或者在另外两张工作表中(从最后一行开始(+1),两张工作表都是列。我还需要它来检查重复,如果文本与另一个单元格完全匹配,则根本不向该工作表添加文本 这是我一直在修补的代码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
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);