2012-11-10 6 views
6

Utilizzando script e foglio di calcolo di google apps, ho cercato di fare una cosa semplice ma non riesco a capire il problema. Ho un foglio, con una colonna vuota e una colonna con testo. Le colonne non sono una accanto all'altra. Sto cercando di cercare il testo in ogni cella in una colonna, e se il testo viene trovato, quindi impostare il valore della cella nella colonna vuota come 'Sì'.colonna del foglio di calcolo di ricerca per il testo in una stringa e restituire un risultato in un'altra colonna

Esempio (spiacente nessun codice - sono andato in tondo con essa per ore, e quello che ho è così contorto, è meglio per fornire solo un esempio):

Column A with text Empty Column F 
abcd efg hij 
klmn opq rstu 
vwxzy     Yes 

Qual è il più semplice codice per cercare la colonna A per 'xyz' e restituire un 'Sì' nella colonna F?

Ho esaminato e provato circa una dozzina di esempi di codice diversi online e non riesco a far funzionare nessuno di loro. Apprezzo qualsiasi aiuto con questo !!

EDIT (finale si spera) per il mio uso (ho alcune utility back-end che mi ottengono il numero di colonna in base al nome di intestazione, che il codice non incluso in questo, FYI):

var sskey = SpreadsheetApp.openById('**********************') 

function otherfunction(){ 
    addCustomValue('POCs', 'Groups', 'Champion', 'Champion', 'Yes'); 
} 

function addCustomValue(sheetNamestr, searchColnamestr, writeColnamestr, searchKeystr, writeValstr) { 
    var sheet = sskey.getSheetByName(sheetNamestr); 
    var searchColnum = MyUtilities.getColIndexByName(sheet, 1, searchColnamestr); 
    var writeColnum = MyUtilities.getColIndexByName(sheet, 1, writeColnamestr); 
    var data = sheet.getDataRange().getValues(); 
    for (n=0; n<data.length; ++n) { 
    if (data[n][searchColnum-1].toString().match(searchKeystr)==searchKeystr){ data[n][writeColnum-1] = writeValstr}; 
    } 
    sheet.getRange(1,1,data.length,data[0].length).setValues(data); 
} 

Grazie Serge! Ora posso eseguire questo sui miei fogli di calcolo sulla base di eventuali colonne e condizioni!

+0

considerare l'utilizzo della formula (in F1) = ARRAYFORMULA (if (ISERROR (FIND ("xyz", A: A)), "", "SÌ")) – DavidF

+0

thx @DavidF ma cercando di evitare nelle formule di fogli con GAS – user1783229

risposta

9

questo è un possibile script semplice che fa ciò che ti serve. (Se il foglio contiene le formule o funzione personalizzata allora dovrebbe essere modificato per tenerne conto)

function test(){ 
var sh = SpreadsheetApp.getActiveSheet(); 
var data = sh.getDataRange().getValues(); // read all data in the sheet 
for(n=0;n<data.length;++n){ // iterate row by row and examine data in column A 
if(data[n][0].toString().match('xyz')=='xyz'){ data[n][5] = 'YES'};// if column A contains 'xyz' then set value in index [5] (is column F) 
} 
Logger.log(data) 
sh.getRange(1,1,data.length,data[0].length).setValues(data); // write back to the sheet 
} 
+0

fantastico - thx! ha fatto un po 'di rielaborazione per personalizzare ma ha usato la stessa struttura di base. vedere le modifiche sopra. – user1783229

+0

l'unica cosa strana è che il foglio di calcolo mostra "Lavorare ..." anche se l'intera funzione è finita. Ho messo un foglio di carta alla fine che si verifica per dimostrare che la funzione era finita. E la pagina di script indicava anche che la funzione era finita. Non so perché il foglio di calcolo continua a dire "funziona ..." anche dopo l'ultimo tipo. Il "lavoro ..." rimane solo quando il foglio ha circa 130 righe, ma non quando eseguo il test di una dozzina di righe. Strano. L'unico modo per liberarsene è aggiornare la pagina. – user1783229

+0

non preoccuparti di questo ... succede quando i server di Google non sono in "condizioni migliori" ;-) o se il tuo ISP si sente stanco ... –

3
function myFunction() { 
    //Variable to keep track of the sheet 
    var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); 
    //Start at row 1, end at the last row of the spreadsheet 
    for(var i=1;i<sheet.getLastRow();i++){ 
    var value = sheet.getRange(i, 1).getValue(); 
    //Compare the value of the cell to 'xyz', if it is then set column 4 for that row to "Yes" 
    if(value == 'xyz'){ 
     sheet.setActiveRange(sheet.getRange(i, 4)).setValue('Yes'); 
    } 
    } 
} 
+1

ciò rende ripetute le chiamate sull'api all'interno del ciclo piuttosto che l'approccio consigliato per ottenere l'intero intervallo all'inizio, funzionante attraverso la matrice risultante e riscrivendo i valori alla fine. Anche la domanda chiede di trovare testo all'interno di una cella che non sia uguale al contenuto della cella – DavidF

+0

thx - penso che la risposta di serge sia più adatta - apprezzare l'input! – user1783229

+0

@Serge insas - Il tuo quasi funziona, ma non puoi impostare valori del genere a meno che ogni cella della colonna A contenga xyz, in più essa imposterà i valori di tutte le colonne in "NOT_FOUND". – user1795832

Problemi correlati