Google script hücreye veri doğrulama uygulama

Katılım
29 Ocak 2024
Mesajlar
203
Excel Vers. ve Dili
Office 2016
Kıymetli Hocalarım merhaba;

Aşağıdaki linkte yer alan Google sheet "Data" tablosunda, A sütunundaki hücrelerde adlandırılmış aralıktan gelen veri doğrulama mevcut;
Bu veriler "Parametre" sayfasının A sütunundan almakta; ve veri doğrulama elemanları A_, B_, C_,D_, E_ şeklinde;
Aynı zamanda "Parametre" sayfasında bu elamanlara dair alt elamanların olduğu veriler mevcut ve bunlar da ana elaman adlarıyla (A_, B_, C_,D_, E_ ) adlandırılmış durumda;


https://docs.google.com/spreadsheets/d/


Burada yapmak istediğim

Data sayfasının A sütununda bir hücre değiştiği zaman (Dolu bir değerde), hemen sağında B sütunun hücresine aynı isimdeki veri doğrulama uygulamak;

Örnek: A5 hücresi "E_" değeri seçildi, hemen B5 hücresine, "E_" olarak adlandırılmış (e1,e2,e3, ..... ) veri doğrulamayı uygulayacak!, eğer A5 hücresinde de hiç bir veri olmazsa yani boş olursa B5 hücresindeki veri doğrulamayı silecek;

Bu işlemi yapacak bir script oluşturmaya çalışıyorum ama beceremedim, yardımcı olursanız çok sevinirim.

Kod:
function onEdit(){

  var tabLists = "Parametre";
  var tabValidation = "Data";
  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var datass = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(tabList);

  var activeCell = ss.getActiveCell();

  if(activeCell.getColumn() == 1 && activeCell.getRow() > 1 && ss.getSheetName() == tabValidation){

    activeCell.offset(0, 1).clearContent().clearDataValidations();

    var makes = datass.getRange(1, 1, 1, datass.getLastColumn()).getValues();

    var makeIndex = makes[0].indexOf(activeCell.getValue()) + 1;

    if(makeIndex != 0){

        var validationRange = datass.getRange(3, makeIndex, datass.getLastRow());
        var validationRule = SpreadsheetApp.newDataValidation().requireValueInRange(validationRange).build();
        activeCell.offset(0, 1).setDataValidation(validationRule);

     }  

  }

}
şimdiden teşekkürler,

iyi hafta sonları dilerim.
 
Katılım
6 Mart 2024
Mesajlar
310
Excel Vers. ve Dili
2010 TR & 2016 TR
Merhaba,

Aşağıdaki kod, Google Sheets’teki Data sayfasında A2:A aralığında yapılan değişikliklere tepki vererek, yan hücreye dinamik bir açılır liste (dropdown) oluşturur.
Kod, hem sade bir yapı hem de açıklayıcı yorumlar içerir.
Bu yapı sayesinde örneğin bir "kategori" seçtiğinizde, yanındaki hücrede o kategoriye ait seçenekleri görebilirsiniz.

Açıklamalar kod içinde satır satır verilmiştir.

Örnek Dosya: Veri Doğrulama

C++:
function onEdit(e) {
  const range = e.range; // tetiklenen hücre (Target)
  const sheet = range.getSheet(); // Target’ın bulunduğu sayfa

  // 1. Sayfa kontrolü: Sadece "Data" sayfasında çalışsın
  if (sheet.getName() !== "Data") return;

  // 2. Sütun kontrolü: A sütunu değilse çık
  if (range.getColumn() !== 1) return;

  // 3. Satır kontrolü: A2'den önceyse çık
  if (range.getRow() < 2) return;

  // 4. Veri doğrulama kontrolü
  const validation = range.getDataValidation();
 
   // 5. Veri doğrulama yoksa çık
  if (!validation) return;

   // 6. Değeri al
  const value = range.getValue();

  // 7. Yan hücre
  const yanHucre = range.offset(0, 1);

  // 8. Eğer hücre boşsa yan hücreyi temizle ve çık
  if (value === "") {
    temizleHucre(yanHucre); // yardımcı function çalıştır.
    return;
  }

  // 9. Parametre sayfasındaki başlıkları al
  const parametreSayfasi = SpreadsheetApp.getActive().getSheetByName("Parametre");
  const baslikSatiri = parametreSayfasi.getRange("1:1").getValues()[0]; // aranacak değer 1. satırda

  // 10. Değerin hangi sütunda olduğunu bul
  const baslikIndex = baslikSatiri.findIndex(b => b.toString().trim() === value.toString().trim());

  // 11. Yan hücreyi her ihtimale karşı temizle
  temizleHucre(yanHucre); // yardımcı function çalıştır.

  // 12. Eşleşen başlık yoksa çık
  if (baslikIndex === -1) return;

  // 13. Liste aralığına geçmeden önce satırları kontrol et
  const hedefSutun = baslikIndex + 1;
  const sonSatir = sonSatirBul(parametreSayfasi, hedefSutun); // yardımcı function çalıştır.

  // 14. Alt kategori listesi boşsa çık
  if (sonSatir < 2) return;

  // 15. Açılır liste için veri aralığını belirle:
  //  - 2. satırdan başla çünkü 1. satır başlık (listeye dahil değil)
  //  - hedefSutun: başlık eşleşmesinden bulunur (örneğin "D")
  //  - sonSatir - 1: başlıktan sonra kaç satır dolu olduğunu bulur
  //  Bu örnekte: Parametre!D2:D45 gibi bir liste elde edilir.
  const listeAraligi = parametreSayfasi.getRange(2, hedefSutun, sonSatir - 1);

  // 16. Veri doğrulama kuralı oluştur
  const kural = SpreadsheetApp.newDataValidation()
    .requireValueInRange(listeAraligi, true)
    .setAllowInvalid(false)
    .setHelpText(`"${value}" listesinden seçim yapınız.`)
    .build();
  yanHucre.setDataValidation(kural);

  // 17. İlk değeri otomatik olarak yaz
  const ilkDeger = listeAraligi.getCell(1, 1).getValue();
  if (ilkDeger !== "") yanHucre.setValue(ilkDeger);
}

/**
 * Belirtilen sayfadaki, verilen sütun numarasına göre (1 tabanlı) son dolu satırı bulur.
 *
 * @param {Sheet} sayfa - Google Sheets sayfa nesnesi
 * @param {number} sutunNumarasi - 1 tabanlı sütun numarası (örnek: A=1, B=2, ... AA=27)
 * @return {number} - Son dolu satır numarası. Eğer hiç veri yoksa 0 döner.
 */
function sonSatirBul(sayfa, sutunNumarasi) {
  const veri = sayfa.getRange(2, sutunNumarasi, sayfa.getMaxRows() - 1).getValues(); // 2. satırdan itibaren
  for (let i = veri.length - 1; i >= 0; i--) {
    if (veri[i][0] !== "") {
      return i + 2; // 0 tabanlı index + 2 (çünkü 2. satırdan başladık)
    }
  }
  return 0;
}

/**
 * Hücrenin içeriğini, biçimini ve veri doğrulamasını temizler.
 * @param {Range} hucre - Temizlenecek hücre nesnesi
 */
function temizleHucre(hucre) {
  hucre.clear(); // içerik, not, biçim temizle
  hucre.setDataValidation(null); // veri doğrulama temizle (gerekirse)
}
 
Son düzenleme:
Katılım
29 Ocak 2024
Mesajlar
203
Excel Vers. ve Dili
Office 2016
Merhaba,

Aşağıdaki kod, Google Sheets’teki Data sayfasında A2:A aralığında yapılan değişikliklere tepki vererek, yan hücreye dinamik bir açılır liste (dropdown) oluşturur.
Kod, hem sade bir yapı hem de açıklayıcı yorumlar içerir.
Bu yapı sayesinde örneğin bir "kategori" seçtiğinizde, yanındaki hücrede o kategoriye ait seçenekleri görebilirsiniz.

Açıklamalar kod içinde satır satır verilmiştir.

Örnek Dosya: Veri Doğrulama

C++:
function onEdit(e) {
  const range = e.range; // tetiklenen hücre (Target)
  const sheet = range.getSheet(); // Target’ın bulunduğu sayfa

  // 1. Sayfa kontrolü: Sadece "Data" sayfasında çalışsın
  if (sheet.getName() !== "Data") return;

  // 2. Sütun kontrolü: A sütunu değilse çık
  if (range.getColumn() !== 1) return;

  // 3. Satır kontrolü: A2'den önceyse çık
  if (range.getRow() < 2) return;

  // 4. Veri doğrulama kontrolü
  const validation = range.getDataValidation();

   // 5. Veri doğrulama yoksa çık
  if (!validation) return;

   // 6. Değeri al
  const value = range.getValue();

  // 7. Yan hücre
  const yanHucre = range.offset(0, 1);

  // 8. Eğer hücre boşsa yan hücreyi temizle ve çık
  if (value === "") {
    temizleHucre(yanHucre); // yardımcı function çalıştır.
    return;
  }

  // 9. Parametre sayfasındaki başlıkları al
  const parametreSayfasi = SpreadsheetApp.getActive().getSheetByName("Parametre");
  const baslikSatiri = parametreSayfasi.getRange("1:1").getValues()[0]; // aranacak değer 1. satırda

  // 10. Değerin hangi sütunda olduğunu bul
  const baslikIndex = baslikSatiri.findIndex(b => b.toString().trim() === value.toString().trim());

  // 11. Yan hücreyi her ihtimale karşı temizle
  temizleHucre(yanHucre); // yardımcı function çalıştır.

  // 12. Eşleşen başlık yoksa çık
  if (baslikIndex === -1) return;

  // 13. Liste aralığına geçmeden önce satırları kontrol et
  const hedefSutun = baslikIndex + 1;
  const sonSatir = sonSatirBul(parametreSayfasi, hedefSutun); // yardımcı function çalıştır.

  // 14. Alt kategori listesi boşsa çık
  if (sonSatir < 2) return;

  // 15. Açılır liste için veri aralığını belirle:
  //  - 2. satırdan başla çünkü 1. satır başlık (listeye dahil değil)
  //  - hedefSutun: başlık eşleşmesinden bulunur (örneğin "D")
  //  - sonSatir - 1: başlıktan sonra kaç satır dolu olduğunu bulur
  //  Bu örnekte: Parametre!D2:D45 gibi bir liste elde edilir.
  const listeAraligi = parametreSayfasi.getRange(2, hedefSutun, sonSatir - 1);

  // 16. Veri doğrulama kuralı oluştur
  const kural = SpreadsheetApp.newDataValidation()
    .requireValueInRange(listeAraligi, true)
    .setAllowInvalid(false)
    .setHelpText(`"${value}" listesinden seçim yapınız.`)
    .build();
  yanHucre.setDataValidation(kural);

  // 17. İlk değeri otomatik olarak yaz
  const ilkDeger = listeAraligi.getCell(1, 1).getValue();
  if (ilkDeger !== "") yanHucre.setValue(ilkDeger);
}

/**
* Belirtilen sayfadaki, verilen sütun numarasına göre (1 tabanlı) son dolu satırı bulur.
*
* @param {Sheet} sayfa - Google Sheets sayfa nesnesi
* @param {number} sutunNumarasi - 1 tabanlı sütun numarası (örnek: A=1, B=2, ... AA=27)
* @return {number} - Son dolu satır numarası. Eğer hiç veri yoksa 0 döner.
*/
function sonSatirBul(sayfa, sutunNumarasi) {
  const veri = sayfa.getRange(2, sutunNumarasi, sayfa.getMaxRows() - 1).getValues(); // 2. satırdan itibaren
  for (let i = veri.length - 1; i >= 0; i--) {
    if (veri[i][0] !== "") {
      return i + 2; // 0 tabanlı index + 2 (çünkü 2. satırdan başladık)
    }
  }
  return 0;
}

/**
* Hücrenin içeriğini, biçimini ve veri doğrulamasını temizler.
* @param {Range} hucre - Temizlenecek hücre nesnesi
*/
function temizleHucre(hucre) {
  hucre.clear(); // içerik, not, biçim temizle
  hucre.setDataValidation(null); // veri doğrulama temizle (gerekirse)
}
Çok teşekkür ederim Hocam
iyi pazarlar
 
Üst