Sekmelerle çalışma

Google Dokümanlar için Apps Komut Dosyası, dokümandaki herhangi bir sekmedeki içeriğe erişmenize olanak tanır.

Sekme nedir?

Google Dokümanlar'da sekmeler adlı bir kuruluş katmanı bulunur. Dokümanlar, günümüzde E-Tablolar'da sekmeler olmasına benzer şekilde, kullanıcıların tek bir doküman içinde bir veya daha fazla sekme oluşturmasına olanak tanır. Her sekmenin kendi başlığı ve kimliği (URL'ye eklenir) vardır. Sekmelerin alt sekmeleri de olabilir. Bunlar, başka bir sekmenin altına yerleştirilmiş sekmelerdir.

Sekmelere erişme

Sekme özelliklerine ve içeriğine Document.getTabs() ile erişilebilir. Bu işlev, Tab öğelerinin listesini döndürür. Sonraki bölümlerde Tab sınıfına kısaca göz atılır. Sekme sınıfı dokümanları da daha ayrıntılı bilgi sağlar.

Sekme özellikleri

Sekme özellikleri, Tab.getId() ve Tab.getTitle() gibi yöntemler kullanılarak alınabilir.

Sekme içerikleri

Her sekmedeki doküman içeriği Tab.asDocumentTab() kullanılarak alınabilir. Belge sınıfı yapısında yapılan değişiklikler bölümünde bu özelliğin nasıl kullanılabileceği açıklanmaktadır.

Sekme hiyerarşisi

Alt sekmeler, Tab.getChildTabs() üzerinden Google Apps Komut Dosyası'nda gösterilir. Tüm sekmelerdeki içeriğe erişmek için alt sekmelerin "ağacını" incelemeniz gerekir. Örneğin, aşağıdaki sekme hiyerarşisini içeren bir doküman düşünün:

Bazıları alt sekmelere sahip üç üst düzey sekme içeren sekme listesi kullanıcı arayüzü

Sekme 3.1.2'ye erişmek için aşağıdakileri yapabilirsiniz:

// Print the ID of Tab 3.1.2.
const doc = DocumentApp.getActiveDocument();
const tab = doc.getTabs()[2].getChildTabs()[0].getChildTabs()[1];
console.log(tab.getId());

İlerleyen bölümlerde, bir dokümanın tüm sekmelerinde yineleme yapmak için örnek kod sağlayan örnek kod bloklarına göz atın.

Sekmeleri almayla ilgili diğer yöntemler

Sekmeleri almanın iki yolu daha vardır:

  • Document.getTab(tabId): Belirtilen kimliğe sahip Sekme'yi döndürür.
  • Document.getActiveTab(): Kullanıcının etkin sekmesini döndürür. Yalnızca bir dokümana bağlı komut dosyalarında çalışır. Bu konu, sonraki bölümlerde daha ayrıntılı olarak açıklanmaktadır.

Doküman sınıfı yapısında yapılan değişiklikler

Geçmişte dokümanlarda sekme kavramı yoktu. Bu nedenle, Document sınıfı, dokümanın metin içeriğine doğrudan erişip bu içeriği değiştirmeye yönelik yöntemler sunuyordu. Aşağıdaki yöntemler bu kategoriye girer:

Sekmelerin ek yapısal hiyerarşisi sayesinde bu yöntemler artık belgedeki tüm sekmelerdeki metin içeriğini anlamsal olarak temsil etmez. Metin içeriği artık farklı bir katmanda gösterilir. Yukarıda belirtilen tüm metin yöntemlerine DocumentTab üzerinden erişilebilir.

Document sınıfındaki mevcut yöntemler, etkin sekmedeki (belirli bir dokümana bağlı komut dosyalarında) veya ilk sekmedeki (etkin bir sekme yoksa) içeriğe erişir ya da bu içerikte değişiklik yapar.

Belirli bir sekmedeki metin içeriğine erişme

Document dışındaki metin yöntemlerini kullanmak yerine, DocumentTab sınıfı dışında bulunan yöntemlerin kullanılması önerilir. Bu yöntemler Tab.asDocumentTab() yöntemi ile kullanılabilir. Örneğin:

// Print the text from the body of the active tab.
const doc = DocumentApp.getActiveDocument();
const documentTab = doc.getActiveTab().asDocumentTab();
const body = documentTab.getBody();
console.log(body.getText());

Kullanıcı seçiminde yapılan değişiklikler

Metin seçim yöntemleri

Document sınıfı, etkin belgede kullanıcının metnin neresinde seçim yaptığını yönetmek için alıcı ve ayarlayıcı sağlar. Bu yöntemler, komut dosyasını çalıştıran kullanıcının etkin sekmesi bağlamında çalışır.

  • Document.getCursor(): Kullanıcı imlecini etkin sekmede döndürür.
  • Document.getSelection(): Etkin sekme'deki kullanıcının seçim aralığını döndürür.
  • Document.setCursor(position): Kullanıcıya etkin dokümanda imlecinin konumunu ayarlama olanağı sunar. Konum etkin olmayan bir sekmedeyse kullanıcının etkin sekmesi de bu konumla ilişkili sekmeye geçirilir.
  • Document.setSelection(range): Etkin dokümanda kullanıcının seçim aralığını belirler. Aralık etkin olmayan bir sekmedeyse kullanıcının etkin sekmesi de söz konusu Aralıkla ilişkili sekmeye geçirilir.

Sekme seçme yöntemleri ve kullanım alanları

Sekmelerin kullanıma sunulmasıyla birlikte, komut dosyasını çalıştıran kullanıcının etkin sekmesini almak ve ayarlamak yararlı olabilir. Bu işlem aşağıdaki yöntemlerle yapılabilir:

Kullanıcının bütünsel "seçimi", etkin sekmenin yanı sıra mevcut imleç konumu veya seçim aralığının bir kombinasyonundan oluşur. Etkin bir seçimle çalışmanın iki yolu vardır: Kullanıcının etkin sekmesini belirli bir sekmeyle açıkça değiştirmek veya kullanıcının etkin sekmesini kullanmak.

Kullanıcının etkin sekmesini açıkça değiştirmek için Document.setActiveTab(tabId) kullanılabilir. Alternatif olarak, etkin olmayan bir sekmeden Position ya da Range ile Document.setCursor(position) veya Document.setSelection(range) çağrısı yapmak bu sekmenin yeni etkinleştirilmesine neden olur.

Komut dosyasının amacı, kullanıcının etkin sekmesini değiştirmeden kullanmaksa Document.setActiveTab(tabId) gerekmez. Document.getCursor() ve Document.getSelection() yöntemleri, kullanıcının komut dosyasını çalıştırdığı sekmeye bağlı olarak etkin sekmede zaten çalışır.

Bir belgenin birden fazla sekme seçimini, farklı sekmelerde birden fazla konumu veya aralığı desteklemediğini unutmayın. Bu nedenle, Document.setActiveTab(tabId) simgesini kullandığınızda önceki imleç konumu veya seçim aralığı temizlenir.

Belirli bir sekme için konum ve aralık yöntemleri

Belirli bir sekme, Position ve Range metin seçimi kavramlarını anlamlandırır. Diğer bir deyişle, bir imleç konumu veya seçim aralığı yalnızca komut dosyası, konumun veya aralığın bulunduğu sekmeyi biliyorsa anlamlı olur.

Bu, DocumentTab.newPosition(element, offset) ve DocumentTab.newRange() yöntemleri kullanılarak gerçekleştirilir. Bu yöntemler, yöntemin çağrıldığı belirli bir DocumentTab seçeneğini hedefleyen bir Konum veya Aralık oluşturur. Buna karşılık, Document.newPosition(element, offset) ve Document.newRange(), etkin sekmeyi (veya komut dosyası bağlı değilse ilk sekmeyi) hedefleyen bir Konum veya Aralık oluşturur.

Seçimlerle çalışmayla ilgili örnek kodların yer aldığı sonraki bölümlerdeki örnek kod bloklarına bakın.

Sekmelerin yaygın kullanım kalıpları

Aşağıdaki kod örneklerinde, sekmelerle etkileşime geçmenin çeşitli yolları açıklanmaktadır.

Belgedeki tüm sekmelerden sekme içeriğini okuma

Sekmeler özelliğinden önce bunu yapan mevcut kod, sekmeler ağacında gezinerek ve Document yerine Tab ve DocumentTab'ten alıcı yöntemleri çağırarak sekmeleri desteklemek için taşınabilir. Aşağıdaki kısmi kod örneğinde, bir dokümanın her sekmesinde bulunan tüm metin içeriğinin nasıl yazdırılacağı gösterilmektedir. Bu sekme gezinme kodu, sekmelerin gerçek yapısıyla ilgilenmeyen diğer birçok kullanım alanına uyarlanabilir.

/** Logs all text contents from all tabs in the active document. */
function logAllText() {
  // Generate a list of all the tabs in the document, including any
  // nested child tabs. DocumentApp.openById('abc123456') can also
  // be used instead of DocumentApp.getActiveDocument().
  const doc = DocumentApp.getActiveDocument();
  const allTabs = getAllTabs(doc);

  // Log the content from each tab in the document.
  for (const tab of allTabs) {
    // Get the DocumentTab from the generic Tab object.
    const documentTab = tab.asDocumentTab();
    // Get the body from the given DocumentTab.
    const body = documentTab.getBody();
    // Get the body text and log it to the console.
    console.log(body.getText());
  }
}

/**
 * Returns a flat list of all tabs in the document, in the order
 * they would appear in the UI (i.e. top-down ordering). Includes
 * all child tabs.
 */
function getAllTabs(doc) {
  const allTabs = [];
  // Iterate over all tabs and recursively add any child tabs to
  // generate a flat list of Tabs.
  for (const tab of doc.getTabs()) {
    addCurrentAndChildTabs(tab, allTabs);
  }
  return allTabs;
}

/**
 * Adds the provided tab to the list of all tabs, and recurses
 * through and adds all child tabs.
 */
function addCurrentAndChildTabs(tab, allTabs) {
  allTabs.push(tab);
  for (const childTab of tab.getChildTabs()) {
    addCurrentAndChildTabs(childTab, allTabs);
  }
}

Dokümandaki ilk sekmedeki sekme içeriğini okuma

Bu, tüm sekmelerin okunmasına benzer.

/** 
 * Logs all text contents from the first tab in the active 
 * document. 
 */
function logAllText() {
  // Generate a list of all the tabs in the document, including any
  // nested child tabs.
  const doc = DocumentApp.getActiveDocument();
  const allTabs = getAllTabs(doc);

  // Log the content from the first tab in the document.
  const firstTab = allTabs[0];
  // Get the DocumentTab from the generic Tab object.
  const documentTab = firstTab.asDocumentTab();
  // Get the body from the DocumentTab.
  const body = documentTab.getBody();
  // Get the body text and log it to the console.
  console.log(body.getText());
}

İlk sekmedeki sekme içeriklerini güncelleme

Aşağıdaki kısmi kod örneğinde, güncelleme yaparken belirli bir sekmenin nasıl hedefleneceği gösterilmektedir.

/** Inserts text into the first tab of the active document. */
function insertTextInFirstTab() {
  // Get the first tab's body.
  const doc = DocumentApp.getActiveDocument();
  const firstTab = doc.getTabs()[0];
  const firstDocumentTab = firstTab.asDocumentTab();
  const firstTabBody = firstDocumentTab.getBody();

  // Append a paragraph and a page break to the first tab's body
  // section.
  firstTabBody.appendParagraph("A paragraph.");
  firstTabBody.appendPageBreak();
}

Etkin veya seçili sekmedeki sekme içeriklerini güncelleme

Aşağıdaki kısmi kod örneğinde, güncelleme yaparken etkin sekmenin nasıl hedefleneceği gösterilmektedir.

/**
 * Inserts text into the active/selected tab of the active
 * document.
 */
function insertTextInActiveTab() {
  // Get the active/selected tab's body.
  const doc = DocumentApp.getActiveDocument();
  const activeTab = doc.getActiveTab();
  const activeDocumentTab = activeTab.asDocumentTab();
  const activeTabBody = activeDocumentTab.getBody();

  // Append a paragraph and a page break to the active tab's body
  // section.
  activeTabBody.appendParagraph("A paragraph.");
  activeTabBody.appendPageBreak();
}

Etkin sekmede bir imleç konumu veya seçim aralığı ayarlama

Aşağıdaki kısmi kod örneğinde, kullanıcının etkin sekmesindeki imleç konumunun veya seçim aralığının nasıl güncelleneceği gösterilmektedir. Bu yalnızca bağlı komut dosyalarında geçerlidir.

/**
 * Changes the user's selection to select all tables within the tab
 * with the provided ID.
 */
function selectAllTables(tabId) {
  const doc = DocumentApp.getActiveDocument();
  const tab = doc.getTab(tabId);
  const documentTab = tab.asDocumentTab();

  // Build a range that encompasses all tables within the specified
  // tab.
  const rangeBuilder = documentTab.newRange();
  const tables = documentTab.getBody().getTables();
  for (let i = 0; i < tables.length; i++) {
    rangeBuilder.addElement(tables[i]);
  }
  // Set the document's selection to the tables within the specified
  // tab. Note that this actually switches the user's active tab as
  // well.
  doc.setSelection(rangeBuilder.build());
}

Etkin veya seçili sekmeyi ayarlama

Aşağıdaki kısmi kod örneğinde, kullanıcının etkin sekmesinin nasıl değiştirileceği gösterilmektedir. Bu yalnızca bağlı komut dosyalarında geçerlidir.

/**
 * Changes the user's selected tab to the tab immediately following
 * the currently selected one. Handles child tabs.
 *
 * 

Only changes the selection if there is a tab following the * currently selected one. */ function selectNextTab() { const doc = DocumentApp.getActiveDocument(); const allTabs = getAllTabs(doc); const activeTab = doc.getActiveTab(); // Find the index of the currently active tab. let activeTabIndex = -1; for (let i = 0; i < allTabs.length; i++) { if (allTabs[i].getId() === activeTab.getId()) { activeTabIndex = i; } } // Update the user's selected tab if there is a valid next tab. const nextTabIndex = activeTabIndex + 1; if (nextTabIndex < allTabs.length) { doc.setActiveTab(allTabs[nextTabIndex].getId()); } }