2012-11-10 30 views
6

Używając skryptu i arkusza aplikacji Google, próbuję zrobić prostą rzecz, ale nie mogę wymyślić problemu. Mam arkusz z pustą kolumną i kolumną z tekstem. Kolumny nie sąsiadują ze sobą. Próbuję wyszukać tekst w każdej komórce w jednej kolumnie, a jeśli tekst zostanie znaleziony, ustaw wartość komórki w pustej kolumnie jako "Tak".szukaj kolumny arkusza kalkulacyjnego dla tekstu w ciągu i zwróć wynik w innej kolumnie

Przykład (przepraszam nie code - Poszedłem w kółko z nim przez kilka godzin, a co mam jest tak zagmatwana, że ​​najlepiej po prostu podać przykład):

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

Co jest najprostszym kod do przeszukania kolumny A dla "xyz" i zwrotu "Tak" w kolumnie F?

Sprawdziłem i wypróbowałem kilkanaście różnych przykładów kodu w Internecie i nie mogę uzyskać żadnego z nich. Doceniamy każdą pomoc z tym !!

EDIT (Final miejmy nadzieję) do mojego użytku (mam kilka narzędzi backend że zrozumcie mnie numer kolumny na podstawie nazwy nagłówka, że ​​kod nie zawiera w tym, 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); 
} 

Dzięki Serge! Teraz mogę uruchomić to w moich arkuszach kalkulacyjnych na podstawie dowolnych kolumn i warunków!

+0

Zastanów się za pomocą wzoru (w F1) = ARRAYFORMULA (if (ISERROR (ZNAJDŹ ("xyz", A:)), "", "TAK")) – DavidF

+0

thx @DavidF ale próba uniknięcia w formułach arkuszy z GAZEM – user1783229

Odpowiedz

9

Jest to możliwe prosty skrypt, który robi to, czego potrzebujesz. (Jeśli arkusz zawiera formuł lub funkcji niestandardowej to powinno być zmienione, aby wziąć to pod uwagę)

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

niesamowite - thx! wykonał trochę przeróbek, aby dostosować, ale używał tej samej podstawowej struktury. zobacz zmiany powyżej. – user1783229

+0

Jedyną dziwną rzeczą jest to, że arkusz kalkulacyjny pokazuje "Praca ...", mimo że cała funkcja została zakończona. Na samym końcu umieściłem sortowanie arkuszy, co okazało się, że funkcja się skończyła. Na stronie skryptu również wskazano, że funkcja się zakończyła. Nie wiadomo, dlaczego arkusz kalkulacyjny mówi "działa ..." nawet po ostatecznym sortowaniu. "Praca ..." zachowuje się tylko wtedy, gdy arkusz ma około 130 rzędów, ale nie wtedy, gdy testuję kilkanaście rzędów. Dziwne. Jedynym sposobem na pozbycie się tego jest odświeżenie strony. – user1783229

+0

nie martw się o to ... zdarza się czasami, gdy serwery Google nie są w "najlepszym stanie" ;-) lub jeśli twój ISP czuje się zmęczony ... –

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

powoduje to wielokrotne wywoływanie api w pętli zamiast zalecanego podejścia do uzyskania całego zakresu na początku, praca poprzez wynikową tablicę i zapisywanie wartości na końcu. Również pytanie wymaga znalezienia tekstu w komórce nie równej zawartości komórki – DavidF

+0

thx - uważam, że odpowiedź serge jest lepiej dopasowana - doceń wejście! – user1783229

+0

@Serge insas - Twoja prawie działa, ale nie możesz ustawić takich wartości, chyba że każda komórka w kolumnie A zawiera xyz, a ponadto ustawi wartości wszystkich kolumn pomiędzy "NOT_FOUND". – user1795832

Powiązane problemy