【问题标题】:Google Script Running Extremely slow谷歌脚本运行速度极慢
【发布时间】:2021-12-24 08:22:30
【问题描述】:

我已经编写了一个附在我的谷歌表上的谷歌脚本。除了今天非常缓慢之外,它一直运行良好。有人知道为什么吗?

var ssID = "1cpR6AVVpk9TF4_I38IFYPPOqk-_bSROHgVVYdaXLXOI";
var formID = "14foKaEoUA_lhDmJTJExwQ5vavsGJShWm_x1kaANLhwU";

var wsData = SpreadsheetApp.openById(ssID).getSheetByName("car_number");

var form = FormApp.openById(formID);

function main(){
  var labels = wsData.getRange(1,1,1,wsData.getLastColumn()).getValues()[0];
  labels.forEach(function(label,i){
    var options = wsData.getRange(2,i + 1,wsData.getLastRow()-1,1).getValues().map(function(o) { return o[0]}).filter(function(o){return o !== ""});
    updateDropdownUsingTitle(label,options);
  });

}

function updateDropdownUsingTitle(title,values) {
  var items = form.getItems();
  var titles = items.map(function(item){
    return item.getTitle();
  });
  var pos = titles.indexOf(title);
  if (pos !== -1) {
  var item = items[pos];
  var ItemID = item.getId();
  updateDropdown(ItemID,values);
  }
}

function updateDropdown(id,values) {
  var item = form.getItemById(id);
  item.asListItem().setChoiceValues(values);
}
   

【问题讨论】:

标签: google-apps-script google-sheets


【解决方案1】:

尝试使用批处理操作获取所有值,并在循环中使用最少的 API 调用,如下所示:

function main() {
  // spreadsheet
  const ssID = '1cpR6AVVpk9TF4_I38IFYPPOqk-_bSROHgVVYdaXLXOI';
  const sheet = SpreadsheetApp.openById(ssID).getSheetByName('car_number');
  const data = sheet.getDataRange().getValues();
  const labels = data.shift();
  const firstColumn = data.map(row => row[0]);
  // form
  const formID = '14foKaEoUA_lhDmJTJExwQ5vavsGJShWm_x1kaANLhwU';
  const form = FormApp.openById(formID);
  const items = form.getItems();
  const itemIds = items.map(item => item.getId());
  const itemTitles = items.map(item => item.getTitle());
  // action
  labels.forEach((label, rowIndex) => {
    const options = firstColumn.filter((option, optionIndex) => optionIndex >= rowIndex && option !== '');
    updateDropdownUsingTitle_(items, itemTitles, label, options);
  });
}

function updateDropdownUsingTitle_(items, itemTitles, title, values) {
  const pos = itemTitles.indexOf(title);
  if (pos !== -1) {
    updateDropdown_(items[pos], values);
  }
}

function updateDropdown_(item, values) {
  item.asListItem().setChoiceValues(values);
}

使用此模式,循环中唯一的 API 调用位于 item.asListItem().setChoiceValues(values)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多