【问题标题】:Google Sheets Script to move completed rows to new sheet谷歌表格脚本将完成的行移动到新工作表
【发布时间】:2020-10-18 13:25:14
【问题描述】:

当数据添加到“I”列时,我有一个脚本可以将数据从一个工作表移动到另一个工作表。

我想调整脚本以执行将所有行(值)从“未付费”表(其中 I 列不为空)移动到已付费表的操作,方法是按下按钮而不是“编辑时” .这将允许一次从多行移动数据,而不是使用一次只移动一行的当前脚本。

有人可以帮忙吗?

function onEdit(event) {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();


  if(s.getName() == "Unpaid" && r.getColumn() == 9 && r.getValue() != "") {
    var row = r.getRow();
    var numColumns = 11;
    var targetSheet = ss.getSheetByName("Paid");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).copyTo((target),{contentsOnly:true});
    s.deleteRow(row);
  } 
  else if(s.getName() == "Paid" && r.getColumn() == 14 && r.getValue() == false) {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("Unpaid");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.deleteRow(row);
  }
}

旁注,脚本的“else if”部分旨在将代码移回原始工作表。这不是必需的,但我无法删除那部分代码并维护功能。

【问题讨论】:

  • 我明白了,我猜是这两件事。 1)我想传输所有行(范围=与上述代码中相同的列),其中列 I 不为空,2)使用按钮来执行此操作。

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


【解决方案1】:

解释:

  • 第一步是在Unpaid 工作表中查找I 为空的行。为此,您可以将ternary 运算符应用于I 列的每个元素。更详细地说,您可以使用map() 函数检查元素是否为空,然后应用filter() 以仅选择列I中具有非空值的行:

    const movRows =  iVals.map((c,i)=>c!=''?i:null).filter(f=>f!=null);
    
  • movRows 包含 I为空的索引。要获取实际的行,您需要将 2 添加到 movRows 的元素中,因为我们是从第二行 I2:I 开始的。

  • 下一步是遍历movRows 数组,对于每个元素,删除Unpaid 工作表中的行并将其移动到Paid 工作表。我们不是直接移动它,而是将数据推送到movData数组,然后使用这个数组来传输这些数据以提高效率。

  • 迭代需要向后进行,否则每次删除一行时,实际数据和工作表结构之间都会出现不匹配

  • 要在UI 中创建按钮,您可以使用onOpen() 触发器。您唯一需要做的就是将以下脚本保存到脚本编辑器,然后自定义菜单按钮将出现在 UI(电子表格)中。你可以点击那个按钮来执行transfer()函数。


解决方案:

function transfer() {

const ss = SpreadsheetApp.getActiveSpreadsheet();
const pSh = ss.getSheetByName('Paid');
const upSh = ss.getSheetByName('Unpaid');
const numColumns = 11;
const iVals = upSh.getRange('I2:I'+upSh.getLastRow()).getValues().flat();  
const movData = [];
const movRows =  iVals.map((c,i)=>c!=''?i:null).filter(f=>f!=null);
movRows.reverse().forEach(row=>{ 
    movData.push(upSh.getRange(row+2,1,1,numColumns).getValues()[0]);
    upSh.deleteRow(row+2);                                    
  });   
pSh.getRange(pSh.getLastRow()+1,1,movData.length,movData[0].length).setValues(movData);   
}

自定义菜单按钮是使用onOpen触发器创建的:

function onOpen() {
  SpreadsheetApp.getUi()
  .createMenu('Macros')
  .addItem('Transfer Rows', 'transfer')
  .addToUi();
}

【讨论】:

  • 谢谢你的朋友,这太棒了
  • @user13599639 我在答案中添加了更多内容。说明以及如何创建自定义菜单按钮。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-09
  • 1970-01-01
  • 1970-01-01
  • 2020-10-29
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多