我已经为此工作了几天,已经颠覆了互联网和这些论坛,但是却找不到任何答案。我在此过程中学到了一些脚本,但是已经确定我需要做的事情超出了我的极限。任何帮助或指导将是超级好评!
我正在为我和我妻子的手工“业务”(项目)建立订单系统。从本质上讲,当我在X列中输入“完成”时,需要将订单1(列aw)从“准备发货”移到“已发送”的下一个空白行上,将wz列中的公式打折。空白行,则应仅检查aw列。
这意味着,一旦订单信息移到新表上,我们就会在这些列中添加其他功能(如果订单过迟,我会把它连接起来发送一封电子邮件道歉-希望不会,但最好是用我们的邮政服务做好准备:))
最初,我学会了如何在x列中添加值时写入'移动行',并了解触发器以及如何调用工作表等。
然后,因为第x,y和z列具有公式,所以我在移动整行时要么删除它们-否则不妙。或者我最终(如果我仅移动a-w列)具有新的(移动的)行,显示在900万行中,因为它认为公式不是空白行。香港专业教育学院试图编辑一个“基于列查找行”脚本,这似乎还可以,但是后来我试图将两者放在一起,那就是当它炸毁时。
谁能告诉我我在哪里错了?
function lastRowForColumn(sheet, column){
// Get the last row with data for the whole sheet.
var ss = spreadSheetApp.getActiveSpreadSheet();// this gets you the
active spreadsheet in which you are working
var sheet = ss.getSheetByName('Sent');
var r = event.source.getActiveRange();
var data = sheet.getRange(1, "A", numRows).getValues();
var numRows = sheet.getLastRow();
// Iterate backwards and find first non empty cell
for(var i = data.length - 1 ; i >= 0 ; i--){
if (data[i][0] != null && data[i][0] != ""){
return i + 1;
var ss = spreadSheetApp.getActiveSpreadSheet();// this gets you the
active spreadsheet in which you are working
var sheet = ss.getSheetByName('Sent');
var r = event.source.getActiveRange();
if(s.getName() == "Ready To Send" && r.getColumn() == 25 &&
r.getValue() == "Sent") {
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Sent");
var lastRow = lastRowForColumn();
var target = targetSheet.getRange(targetSheet, i, 1);
s.getRange(row, 1, 1, 10).moveTo(target);
s.deleteRow(row);
}
}
}
}
答案 0 :(得分:0)
我认为您想要使用getDisplayValues。这样既可以解决您的问题(公式不是空白问题(请确保您的公式在未使用该行时显示空白),也可以解决我的数字问题)。
尝试:
moveMe = [];
rowArray = s.getRange(row,1,1,10).getDisplayValues();
moveMe.push(rowArray);
targetSheet.appendRow(moveMe);
s.deleteRow(row);
您可能需要稍微摔跤appendRow,但这是最干净的。如果仍然无法正常运行,请尝试跳过推送步骤并执行
targetSheet.appendRow(rowArray);
更好(编辑):
您需要先将数据行更改为:
var data = sheet.getRange(1, "A", numRows).getDisplayValues();
,然后您只需执行以下操作即可:
targetSheet.appendRow(data[i]);
s.deleteRow(row);
答案 1 :(得分:0)
此功能接受一个编辑事件,并检查已编辑的值是否已更改为“已发送”。然后,将该行复制到同一电子表格中的已发送工作表中,并保持这些值。
function onEdit(e){
if(e.value != 'Sent') return false; //If not changed to 'Sent' then stop.
var range = e.range; //get the range the edit occured in.
if(range.getColumn() != 25) return false;//see if it was column number 25, ie. Column Y
var sheet = range.getSheet();
if(sheet.getName() != 'Ready To Send') return false;
var editedRow = sheet.getRange(range.getRow(), 1, 1, sheet.getMaxColumns()); //Select the row.
var sent = sheet.getParent().getSheetByName('Sent');
sent.appendRow(editedRow.getValues()[0]); //Copy row to Sent sheet.
sheet.deleteRow(range.getRow()); //Deleted the original row
}
答案 2 :(得分:0)
尝试一下:
function onEdit(e){
var rg=e.range;
var sh=rg.getSheet();
var name=sh.getName();
var col=rg.columnStart;
if(name!='Sheet To Send'){return;}
if(col==24 && e.value=='done') {
var ss=e.source;
var sheet=ss.getSheetByName('Sent');
var row=rg.rowStart;
var srg=sh.getRange(row,1,1,23);
var data=srg.getValues();
var drg=sheet.getRange(sheet.getLastRow()+1,1,1,23);
drg.setValues(data);
sh.deleteRow(row);
}
}