【问题标题】:Google Script: Conditionally copy rows from one sheet to another in the same spreadsheet谷歌脚本:有条件地将行从一个工作表复制到同一个电子表格中的另一个工作表
【发布时间】:2013-01-17 21:51:08
【问题描述】:

我阅读了Google Script: Conditionally copy rows from one spreadsheet to another,但无法让它为我工作。

我需要一个脚本来允许我执行下面引用的文本。请随时编辑my spreadsheet 以制作完整的工作脚本。我会将电子表格公开,任何人都可以复制脚本供自己使用。我真的对脚本写作一无所知,所以我需要把它全部拼出来。抱歉,我对这一切都很陌生,但这将有助于我学习。

https://docs.google.com/spreadsheet/ccc?key=0AoJdwy8V1ldHdFA5M1M1Wlp1NHZhcmxJOUZKVEU4X3c&usp=sharing

如果工作表“All_Mileage”上的 B 列显示“John”,那么我希望该行 从第 3 行开始复制并粘贴到工作表“John”中。

如果工作表“All_Mileage”上的 B 列显示“Adam”,那么我希望该行 从第 3 行开始复制并粘贴到工作表“Adam”中。

如果工作表“All_Mileage”上的 B 列显示“Mike”,那么我希望该行 从第 3 行开始复制并粘贴到工作表“Mike”中。

我在这里看到了其他脚本,但我无法让它们工作。就像我说的,在代码方面我比树苗更环保。

非常感谢!

【问题讨论】:

  • 欢迎您,我不确定您要求书面脚本是否会成功。习惯上显示 what you have tried 并就您遇到的特定问题提出问题。

标签: google-apps-script google-sheets google-spreadsheet-api


【解决方案1】:

C.Lang 是对的,这里不是获取现成脚本的地方……但是由于这个问题很常见,而且经常被回答,所以我花了几分钟来编写和测试……所以就在那里是:

var ss=SpreadsheetApp.getActiveSpreadsheet();// some global variables
var master = ss.getSheetByName('All_Mileage');
var colWidth = master.getMaxColumns();


    function copyRowsOnCondition() {
      var data = master.getDataRange().getValues();
      for(n=2;n<data.length;++n){
        if(data[n][1].length<16){ // if not pre-filled with your text
        Logger.log(data[n][1])
         var dest = ss.getSheetByName(data[n][1].toString().replace(/ /g,''));//remove any spaces that could be included in the name so the name = sheetName for sure
         var destRange = dest.getRange(dest.getLastRow()+1,1);// the place to write
         master.getRange(n+1,1,1,colWidth).copyTo(destRange);the copy itself value & format
         }
      }// loop
    }

编辑: 因为我使用 MasterSheet 中的名称值来查找目标工作表,所以我认为通过使用相同的规则创建目标工作表来处理不存在目标工作表的情况可能很有用, IE。 name = sheetName...

另一个问题是没有办法知道哪些行已经被复制...所以我制作了一个版本来处理所有这些,只复制手动选择的行(即使只有一列)和更改背景颜色以告知这些行已被处理。我还添加了一个菜单以获得最小的舒适度;-)

(如何在寒冷的周日下午保持忙碌 ;-)

var ss=SpreadsheetApp.getActiveSpreadsheet();
var master = ss.getSheetByName('All_Mileage');
var colWidth = master.getLastColumn();// last used col in masterSheet
var sheets = ss.getSheets();// number of sheets

function onOpen() {
  var menuEntries = [ {name: "Copy selected Rows to sheets", functionName: "copyRowsOnConditionV2"},

                     ];
  ss.addMenu("Copy functions",menuEntries);// custom menu
}
function copyRowsOnConditionV2() {
  var sheetNames = [];// array of existing sheet names
  var sheets = ss.getSheets();// number of sheets
  for(s=0;s<sheets.length;++s){sheetNames.push(sheets[s].getName())};
  ss.getActiveSelection().setBackground('#ffffbb'); 
  var selectedfirstRow = ss.getActiveSelection().getRowIndex();
  var selectedHeigth = ss.getActiveSelection().getHeight()
  var selectedFullRange = master.getRange(selectedfirstRow,1,selectedHeigth,colWidth);
  var data = selectedFullRange.getValues();
  for(n=0;n<data.length;++n){
    if(data[n][1].length<16){
     if(sheetNames.toString().match(data[n][1].toString().replace(/ /g,''))!=data[n][1].toString().replace(/ /g,'')){// if no sheet exist with this name
     var newSheet = ss.insertSheet(data[n][1].toString().replace(/ /g,''),ss.getSheets().length);// then create it
     master.getRange(1,1,2,colWidth).copyTo(newSheet.getRange(1,1));// and copy the headers on 2 first rows, then continue as usual
     newSheet.getRange(1,1).setValue('Gas Mileage Log - '+data[n][1].toString().replace(/ /g,''));// set name in header
     SpreadsheetApp.flush();
     var sheets = ss.getSheets();// number of sheets
     var sheetNames = [];// update array of existing sheet names
     for(s=1;s<sheets.length;++s){sheetNames.push(sheets[s].getName())};
     Logger.log(sheetNames)
     };
     var dest = ss.getSheetByName(data[n][1].toString().replace(/ /g,''));//find the destination sheet
     Logger.log(data[n][1].toString().replace(/ /g,''))
     var destRange = dest.getRange(dest.getLastRow()+1,1);// define range
     master.getRange(selectedfirstRow+n,1,1,colWidth).copyTo(destRange);// and make copy below last row
     }
  }
}

下图:

【讨论】:

  • 非常感谢您的帮助。它完美地工作。现在我只需要通过它并找出逻辑。非常感谢您的帮助!
  • 哇,你真有远见。我什至没有考虑添加更多名称时它会如何反应。非常感谢您对此的思考和努力!
猜你喜欢
  • 2010-10-30
  • 1970-01-01
  • 2016-10-06
  • 2018-05-11
  • 1970-01-01
  • 2011-05-29
  • 2020-06-17
  • 1970-01-01
  • 2012-06-10
相关资源
最近更新 更多