Hapus centang kotak centang dalam larik (Google Apps Script - Sheets)

Sep 05 2020

Saya mencoba menulis skrip yang menemukan semua kotak centang di Google Spreadsheet, dan menyetel ulang semuanya menjadi tidak dicentang. (Pembersihan lembar harian) Saya bisa mendapatkan array dari semua sel yang berisi kotak centang dari satu lembar dan menghapus centangnya, tetapi saya memutar roda saya di sini tentang cara secara efisien mendapatkan semua kotak centang di semua lembar untuk tidak dicentang. Saya melihat ada metode yang disebut uncheck () jadi itulah yang saya coba gunakan. Script dan array saya ada di bawah. Pertanyaan saya adalah ...

  1. Saat ini saya melakukan perulangan melalui array dan menghapus centang setiap kotak satu per satu. Skripnya agak lambat dan tujuan akhir saya adalah membuatnya melalui semua lembar di dalam spreadsheet. Saya khawatir naskahnya mungkin habis waktunya. Adakah cara untuk menghapus centang semua kotak centang pada 1 lembar sekaligus, tanpa melakukan perulangan yang melewatinya 1 per satu? Atau bahkan lebih baik membuatnya melakukan semua kotak centang di semua lembar sekaligus? Jelas menghapus centang mereka dalam sekali jalan akan lebih efisien, tetapi tidak tahu jika itu adalah opsi dan semua yang saya coba tidak berhasil. (Saya juga mempertimbangkan untuk mengganti file setiap hari dengan file template yang semua kotak centangnya sudah tidak dicentang, namun saya memerlukan ID dokumen agar tidak pernah berubah)

  2. Bagaimana cara agar skrip saya melewati semua tab di spreadsheet? Apakah itu berarti mendapatkan semua lembaran dan melakukan perulangan for lainnya? Atau adakah cara yang lebih efisien untuk melakukan ini juga?

Naskah:

function uncheckCheckboxes() {
  var spreadsheet=SpreadsheetApp.getActive(); // get spreadsheet
  var sheet=spreadsheet.getActiveSheet(); // get current sheet
  var allRange=sheet.getDataRange(); // get all data in sheet
  var validations=allRange.getDataValidations();
  var Checkboxes=[]; // create empty array
  for(var i=0;i<validations.length;i++) { 
    for(var j=0;j<validations[i].length;j++) {
      var rule=validations[i][j];
      if(rule!=null) {
        var criteria = rule.getCriteriaType();
        if(criteria == SpreadsheetApp.DataValidationCriteria.CHECKBOX) {
          Checkboxes.push(Utilities.formatString('%s', sheet.getRange(i+1,j+1).getA1Notation())); // get array of only cells w/ checkboxes
        }
      }
    }
  }
  Logger.log(Checkboxes) // Logging
  for (var CB in Checkboxes) { // Loop through array
  var checkbox = Checkboxes[CB]; 
  sheet.getRange(checkbox).uncheck(); // uncheck checkbox
  }

}

Larik dari 1 lembar (disimpan dalam variabel 'Kotak centang'): [C3, D3, E3, F3, G3, H3, C4, D4, E4, F4, G4, H4, C5, D5, E5, F5, G5, H5, C6, D6, E6, F6, G6, H6, C7, D7, E7, F7, G7, H7, C8, D8, E8, F8, G8, H8, C9, D9, E9, F9, G9, H9, C10, D10, E10, F10, G10, H10, C11, D11, E11, F11, G11, H11, C12, D12, E12, F12, G12, H12, C13, D13, E13, F13, G13, H13, C14, D14, E14, F14, G14, H14, C15, D15, E15, F15, G15, H15, C16, D16, E16, F16, G16, H16, C17, D17, E17, F17, G17, H17, C18, D18, E18, F18, G18, H18, C19, D19, E19, F19, G19, H19, C20, D20, E20, F20, G20, H20, C21, D21, E21, F21, G21, H21, C22, D22, E22, F22, G22, H22, C23, D23, E23, F23, G23, H23, C24, D24, E24, F24, G24, H24, C25, D25, E25, F25, G25, H25, C26, D26, E26, F26, G26, H26, C27, D27, E27, F27, G27, H27, C28, D28, E28, F28, G28, H28, C29, D29, E29, F29, G29, H29]

Saya telah mengerjakan ini selama berjam-jam dan akan menyukai beberapa keahlian dari seseorang yang benar-benar tahu apa yang mereka lakukan. (Saya jelas bukan ahli JavaScript!)

Terima kasih sebelumnya.

Amber

Jawaban

3 chillin Sep 05 2020 at 18:47

Belum teruji, tidak bisa menguji saat ini.

function uncheckCheckboxesFromAllSheets() {
    // Should uncheck all checkboxes from all worksheets 
    // in a given document.
    
    const spreadsheet = SpreadsheetApp.getActive();
    
    for (const sheet of spreadsheet.getSheets()) {
        Logger.log(`About to uncheck checkboxes in sheet ${sheet.getName()}`);
        sheet.getDataRange().uncheck();
    }
}

Dokumentasi untuk Range.uncheck()(https://developers.google.com/apps-script/reference/spreadsheet/range#uncheck):

Mengubah status kotak centang dalam rentang menjadi "tidak dicentang". Mengabaikan sel dalam rentang yang saat ini tidak berisi nilai yang dicentang atau tidak dikonfigurasikan.

Pikirkan itu berarti Anda dapat memberikannya rentang multi-sel dan uncheckfungsi secara internal akan mengurus detail untuk Anda (seperti melewatkan sel yang tidak relevan).


Tidak terkait: Jika Anda memiliki array dan perlu mengulang nilainya secara langsung, mungkin gunakan for-ofloop sebagai ganti for-in.