【问题标题】:Google Script: Conditionally copy rows from one spreadsheet to anotherGoogle Script:有条件地将行从一个电子表格复制到另一个电子表格
【发布时间】:2012-06-10 01:24:30
【问题描述】:

我找到了基本解决方案https://stackoverflow.com/a/4809413/1438650,但它缺少我项目的条件和非连续方面。我需要该副本基于 Col G 的值,然后将 A、B 和 H:S 列复制到另一个电子表格。

function movePros() {
  var date = Utilities.formatDate(new Date, "CST", "yyyy-MM-dd'T'HH:mm:ss'Z'")            //"MM/dd/yyyy"
  var source = SpreadsheetApp.getActiveSpreadsheet();
  var target = SpreadsheetApp.openById("0ApBdJlRcFy9XdGx0aXRabWlweGxyY3czZzZIemVla3c");
  var lastRow = source.getLastRow();
  var sheet = source.getSheetByName("City");
 var data = sheet.getDataRange.getValues();  //This makes an array, right?
   Browser.msgBox(data.slice(1))
  // I've tried, but still don't know how get at the individual cell values so that I can both check them and write them in the correct order which is different than the source
  var prospect=[DateCalled,PriceSurvey,VolSurvey,Company,Phone,Contact,OdmNotes,Address,City,State,Zip,County,Sic,"","","","","","","","=IFERROR(IF(INDIRECT(\"W\"&ROW())<>\"\",TEXT(INDIRECT(\"W\"&ROW()),\"yyyyww\")+0,IF(INDIRECT(\"T\"&ROW())<>\"\",TEXT(INDIRECT(\"T\"&ROW()),\"yyyyww\")+0,IF(INDIRECT(\"A\"&ROW())<>\"\",TEXT(INDIRECT(\"A\"&ROW()),\"yyyyww\")+1,\"\"))),\"\")","U","","","","","",ODM,"",""];  
// var prospect=[data()[0]..... ugh, I don/'t know....  
 /*    
var ODM = sheet.getRange("A"+i).getValues();
var DateCalled = sheet.getRange("B"+i).getValues();
var PriceSurvey = sheet.getRange("H"+i).getValues();
var VolSurvey = sheet.getRange("I"+i).getValues();
var Company = sheet.getRange("J"+i).getValues();
var Phone = sheet.getRange("K1"+i).getValues();
var Contact = sheet.getRange("L"+i).getValues();
var OdmNotes = sheet.getRange("M"+i).getValues();
var Address = sheet.getRange("N"+i).getValues();
var City = sheet.getRange("O"+i).getValues();
var State = sheet.getRange("P"+i).getValues();
var Zip = sheet.getRange("Q"+i).getValues();
var County = sheet.getRange("R"+i).getValues();
var Sic = sheet.getRange("S"+i).getValues(); 
 */ 

while (i <= lastRow) {
  var i = 2 
  if (sheet.getRange("G"+i).getValue()==1 && sheet.getRange("U"+i).getValue()=="") {  //cheking 

target.appendRow(prospect); 

source.getRange("U"+i).setValue(date);
i++;

} else {
   i++;
  }     
  } 


}

【问题讨论】:

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


    【解决方案1】:

    这是一个脚本“提案”,您可以完成它以使其发挥作用。 'if' 语句需要实现,如果不确切知道您需要什么,我就无法做到。 在那里使用数组的一般想法,我相信你会设法让它工作。

    function movePros() {
      var date = Utilities.formatDate(new Date, "CST", "yyyy-MM-dd'T'HH:mm:ss'Z'")            //"MM/dd/yyyy"
      var source = SpreadsheetApp.getActiveSpreadsheet();
      var target = SpreadsheetApp.openById("0ApBdJlRcFy9XdGx0aXRabWlweGxyY3czZzZIemVla3c");
      var lastRow = source.getLastRow();
      var sheet = source.getSheetByName("City");
      var data = sheet.getDataRange().getValues();
      var prospect=['ODM','DateCalled','PriceSurvey','VolSurvey','Company','Phone','Contact','OdmNotes','Address','City,State','Zip','County','Sic']
      var line = new Array();
      var targetArray= new Array();
      targetArray.push(prospect);// create a header on first row of target
      for(i=0;i<data.length;++i){ // iterate rows
      for (j=0;j<data[i].length;++j){ // iterate columns
      if (place here your conditions if data must be copied or not, you can have many conditions alltogether){line.push(data[i][j]}// if cell meets condition, add to destination row
      }
      targetArray.push(line)// add row to destination (you could need to add a condition here too)
      }
    target.getRange(1,1,targetArray.length,targetArray[0].length).setValues(targetArray);
    } 
    

    remark : data[i] 是源工作表的一行,data[i][j] 是该行中的一个单元格,从那里您可以对任何行中的任何单元格进行寻址。通常在 for 循环中执行此操作,但您可以在不循环每一行来获取所需数据的情况下执行此操作。

    Edit#1:您复制非连续数据的条件可能是这样的:

      if (j==5||j==7||j==9){line.push(data[i][j])}
    

    抱歉有点长。 编辑#2:查看您的目标文档我注意到您有多个工作表,您还应该告诉脚本它应该在哪个工作表上写入数据。这是一个如何做的例子:

      var ss = SpreadsheetApp.openById("your spreadsheet ID");// this is already done in your script
      SpreadsheetApp.setActiveSpreadsheet(ss);
      var sh = SpreadsheetApp.setActiveSheet(ss.getSheets()[0]);// select first sheet in target spreadsheet 
    

    【讨论】:

      【解决方案2】:

      块引用

      这是我的编码,我想这会对你有所帮助。

      function GetData() {
        var source = SpreadsheetApp.getActiveSpreadsheet();
        var target = SpreadsheetApp.openById("0Aj7gIt4f65xidEN1R1lxZksxeFRBYkdHWmVtdE5aOGc");
        var lastRow = source.getLastRow();
        var source_sheet = source.getSheetByName("Source");
        var target_sheet = target.getSheetByName("Target");
      
        var source_range = source_sheet.getDataRange();
        var target_range = target_sheet.getDataRange();
      
        var i = 2;
        while (i <= lastRow) {
        if (source_sheet.getRange("D"+i).getValue() == "Over Due" ) {
          var ItemNo = source_sheet.getRange("A"+i).getValue();
          var UserName = source_sheet.getRange("B"+i).getValue();
          var Location = source_sheet.getRange("C"+i).getValue();
          var Status = source_sheet.getRange("D"+i).getValue();
          var Comments = source_sheet.getRange("E"+i).getValue();
          var data = [ItemNo,UserName,Location,Status,Comments];
          target_sheet.appendRow(data);
          i++;
          } else {
            i++;
            }
          }
        }
      

      【讨论】:

        【解决方案3】:

        这里有一些提示:

        • 获取包含整行的范围,然后调用 getValues() 一次获取所有值,而不是像现在这样一次获取一个值。
        • 使用您要测试的条件将if() 语句包裹在您的appendRow() 调用周围。
        • 您可以appendRow(),因为没有办法一次追加多行。

        【讨论】:

        • 我又试了一次,但尽管看了一整天,我还是不知道如何访问数组中的值。 (我修改了上面的脚本以反映我的工作。)
        猜你喜欢
        • 1970-01-01
        • 2010-10-30
        • 2018-12-20
        • 1970-01-01
        • 2016-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多