Вопрос по – Google Script: условно копировать строки из одной таблицы в другую

2

Я нашел основное решениеhttps://stackoverflow.com/a/4809413/1438650 но в нем отсутствуют как условные, так и несмежные аспекты моего проекта. Мне нужно, чтобы копия была основана на значении Col G, а затем скопировать столбцы A, B и amp; 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++;
  }     
  } 


}

Ваш Ответ

3   ответа
0

Get a range that includes the entire row, and then call getValues() to get all the values at once, instead of one at a time like you are doing now. Wrap an if() statement around your appendRow() call, using the condition you want to test for. It's OK to have you appendRow(), since there is no method to append multiple rows at once.
Error: User Rate Limit Exceeded jlpaluch
2

чтобы заставить это работать. «Если» Заявление должно быть реализовано, я не могу сделать это, не зная точно, что вам нужно. Общая идея использовать его там, я уверен, вам удастся заставить его работать.

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

примечание: 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 
1

Это мой код, я думаю, это поможет вам.

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

Похожие вопросы