Google Sheetsスクリプトの高速化・効率化に関するヘルプ

-2
2022.04.07

以下のスクリプトを持っていますが、これをもっと効率的にする方法があれば教えてください。動作は素晴らしいのですが、必要なことを行うのに少し時間がかかります。主に、clearContent()を1つに凝縮する方法はありますか?また、より効率的にするための他の方法もあれば教えてください。ありがとうございます。

function onEdit(){
  var tabLists = "Master";
  var tabValidation = "Planning";
  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var datass = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(tabLists);
  
  var activeCell = ss.getActiveCell();
  
  if(activeCell.getColumn() == 3 && activeCell.getRow() > 4 && ss.getSheetName() == tabValidation){
    
    activeCell.offset(0,1).clearContent().clearDataValidations();
    activeCell.offset(0,4).clearContent();
    activeCell.offset(0,5).clearContent();
    activeCell.offset(0,6).clearContent();
    activeCell.offset(0,9).clearContent();
    activeCell.offset(0,12).clearContent();
    activeCell.offset(0,16).clearContent();
    activeCell.offset(0,21).clearContent();
    
    var makes = datass.getRange(3, 1, 1, datass.getLastColumn()).getValues();
    
    var makeIndex = makes[0].indexOf(activeCell.getValue()) + 1;
    
    if(makeIndex != 0){
    
        var validationRange = datass.getRange(4, makeIndex, datass.getLastRow());
        var validationRule = SpreadsheetApp.newDataValidation().requireValueInRange(validationRange).build();
        activeCell.offset(0, 1).setDataValidation(validationRule);
  
     }  
      
  }
  
}
回答
1
2022.04.10

この回答はGoogleサポートから引用したRecommended Answerです。Google Sheetsスクリプトをより速く、より効率的にするためのヘルプ(clearContent())。ハイドによる回答。


あなたの要件が記述されておらず、テストを可能にするサンプルのスプレッドシートもないため、あなたのコードが実際に何をすることになっているのかわかりません。それでも、次のようなことを試してみるのはいかがでしょうか。

function onEdit(e) {
  const ss = SpreadsheetApp.getActive();
  const dataSheet = ss.getSheetByName('Master');
  const validationSheet = 'Planning';
 
  let sheet;
  if (e.range.columnStart !== 3
    || e.range.rowStart <= 4
    || (sheet = e.range.getSheet()).getSheetName() !== validationSheet) {
    return;
  }
  const columnNumbers = [1, 4, 5, 6, 9, 12, 16, 21]
    .map(offset => e.range.columnStart + offset);
  const rangesA1 = columnNumbersToColumnLabels_(columnNumbers)
    .map(columnLetter => columnLetter + e.range.rowStart);
  sheet.getRangeList(rangesA1).clearContent().clearDataValidations();
 
  const makes = dataSheet.getRange(3, 1, 1, dataSheet.getLastColumn()).getValues();
  const makeIndex = makes[0].indexOf(e.value) + 1;
  if (makeIndex !== 0) {
    const validationRange = dataSheet.getRange(4, makeIndex, dataSheet.getLastRow());
    const validationRule = SpreadsheetApp.newDataValidation().requireValueInRange(validationRange).build();
    e.range.offset(0, 1).setDataValidation(validationRule);
  }
}
 

/**
* Converts column numbers such as 1, 26, 27 and 18278 into column labels like "A", "Z", "AA" and "ZZZ".
*
* Returns a text string or an array of text strings that matches the dimensions of numbers.
* Supports single values and arrays like [1, 26, 27] or [[1, 2], [13, 14], [27, 28]].
* Returns null for '', null and undefined.
* Returns NaN for non-numbers and numbers less than 1.
*
* @param {Number[][]} numbers A column number or or an array of column numbers to convert to column labels.
* @return {String[][]} Column labels like "A", "Z", "AA" and "ZZZ", or NaN if numbers is not a positive number.
*/
function columnNumbersToColumnLabels_(numbers) {
  // version 1.7, written by --Hyde 3 November 2019
  if (Array.isArray(numbers)) {
    return numbers.map(columnNumbersToColumnLabels_);
  }
  if (numbers === '' || (numbers == null)) {
    return null;
  }
  if (typeof numbers !== 'number' || numbers < 1) {
    return NaN;
  }
  var alphabetStart = 'A'.charCodeAt(0);
  var alphabetSize = 'Z'.charCodeAt(0) - alphabetStart + 1;
  var colLabel = '';
  while (numbers > 0) {
    var colNumber = (numbers - 1) % alphabetSize;
    var asciiCode = colNumber + alphabetStart;
    colLabel = String.fromCharCode(asciiCode) + colLabel;
    numbers = (numbers - colNumber - 1) / alphabetSize;
  }
  return colLabel;
}