Frage an google-sheets, google-spreadsheet-api, google-apps-script – Google Script: Bedingtes Kopieren von Zeilen von einer Tabelle in eine andere

2

Ich habe die Grundlösung gefundenhttps://stackoverflow.com/a/4809413/1438650 aber es fehlen sowohl die bedingten als auch die nicht zusammenhängenden Aspekte meines Projekts. Die Kopie muss auf dem Wert von Spalte G basieren, und dann müssen die Spalten A, B und H: S in die andere Tabelle kopiert werden.

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++;
  }     
  } 


}

Deine Antwort

3   die antwort
1

Blockquote

Das ist meine Codierung, ich denke das würde dir helfen.

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++;
      }
    }
  }
0

Hier sind einige Tipps für Sie:

Rufen Sie einen Bereich ab, der die gesamte Zeile enthält, und rufen Sie dann aufgetValues() um alle Werte auf einmal zu erhalten, anstatt wie bisher nacheinander.Wickeln Sie einif() Aussage um IhreappendRow() Rufen Sie mit der Bedingung an, auf die Sie testen möchten.Es ist in Ordnung, dich zu habenappendRow(), da es keine Methode gibt, mehrere Zeilen gleichzeitig anzufügen.
Ich habe einen weiteren Versuch unternommen, aber obwohl ich den ganzen Tag gelesen habe, weiß ich nicht, wie ich auf die Werte im Array zugreifen soll. (Ich habe das obige Skript geändert, um meine Arbeit widerzuspiegeln.) jlpaluch
2

Hier ist ein Skript "Vorschlag", den Sie vervollständigen könnten, damit es funktioniert. Die "Wenn" -Anweisung muss implementiert werden, ich konnte es nicht tun, ohne genau zu wissen, was Sie brauchten. Ich bin mir sicher, dass Sie es schaffen werden, es dort zum Laufen zu bringen.

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);
} 

Bemerkung: data [i] ist eine Zeile Ihres Quellblatts, data [i] [j] ist eine Zelle in dieser Zeile. Von dort aus können Sie jede Zelle in jeder Zeile ansprechen. Normalerweise macht man das in einer for-Schleife, aber Sie könnten es tun, ohne in jeder Zeile eine Schleife zu machen, um die gewünschten Daten zu erhalten.

Bearbeiten Sie # 1: Ihre Bedingung zum Kopieren nicht zusammenhängender Daten könnte etwa so lauten:

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

tut mir leid, dass ich ein bisschen lang bin. Bearbeiten Nr. 2: Wenn Sie Ihr Zieldokument betrachten, ist mir aufgefallen, dass Sie mehrere Blätter darin haben. Sie sollten dem Skript auch mitteilen, auf welches Blatt Daten geschrieben werden sollen. Hier ist ein Beispiel, wie es geht:

  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 

Verwandte Fragen