скрипт приложений google как скопировать условное форматирование на другой лист

def compare_dict(d1, d2, ignore):
    for k in d1:
        if k in ignore:
            continue
        try:
            if d1[k] != d2[k]:
                return False
        except KeyError:
            return False
    return True

Редактирование комментария: вы можете сделать что-то вроде compare_dict(d1, d2, ignore) and compare_dict(d2, d1, ignore) или дублировать for

def compare_dict(d1, d2, ignore):
    ignore = set(ignore)
    for k in d1:
        if k in ignore:
            continue
        try:
            if d1[k] != d2[k]:
                return False
        except KeyError:
            return False

    for k in d2:
        if k in ignore:
            continue
        try:
            if d1[k] != d2[k]:
                return False
        except KeyError:
            return False
    return True

. Все быстрее и чище! Обновление: набор трансляции (игнорирование)

0
задан Thomas Perrin 27 February 2019 в 14:58
поделиться

1 ответ

  • Вы хотите скопировать условные форматы исходного листа на все остальные листы.

Если я правильно понимаю, как насчет использования Sheets API? Я думал, что причиной возникновения такой ошибки может быть информация из исходного листа, включенная в условные форматы. Исходя из этого, я изменил информацию листа, используя Sheets API для копирования условных форматов. Я думаю, что есть несколько ответов для вашей ситуации. Поэтому, пожалуйста, подумайте об этом как об одном из них.

Когда вы используете Sheets API, включите Sheets API в консоли Advanced Google Services и API. О том, как включить Sheets API, вы можете узнать в здесь .

Пример сценария:

function myFunction() {
  var my_spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var spreadsheetId = my_spreadsheet.getId();
  var all_sheets = my_spreadsheet.getSheets();
  var source_sheet = all_sheets[0].getSheetName();

  var srcConditionalFormats = Sheets.Spreadsheets.get(spreadsheetId, {ranges: source_sheet, fields: "sheets/conditionalFormats"});
  all_sheets.shift();
  var cf = srcConditionalFormats.sheets[0].conditionalFormats;
  var reqs = all_sheets.reduce(function(ar, e, i) {
    return ar.concat(cf.map(function(f, j) {
      var temp = JSON.parse(JSON.stringify(f));
      temp.ranges = temp.ranges.map(function(g, k) {
        g.sheetId = e.getSheetId();
        return g;
      });
      return {addConditionalFormatRule: {rule: temp}};
    }));
  }, []);
  Sheets.Spreadsheets.batchUpdate({requests: reqs}, spreadsheetId);
}

В этом сценарии запускается следующий поток.

  1. Извлечь объект условного формата из исходного листа, используя Spreadsheets.get().
    • Из вашего сценария предполагается, что исходный лист является первым индексом листов.
  2. Создать тело запроса для Spreadsheets.batchUpdate().
    • В это время информация листа (sheetId) изменяется.
  3. Запросить созданное тело запроса, используя Spreadsheets.batchUpdate().

Примечание:

  • В вашем скрипте есть орфографическая ошибка в SpreadsheetApp.getActiveSpreadSheet() и никакой метод не используется в my_spreadsheet.getAllSheets(). Но в вашем вопросе написано, что ошибка The conditional formating rule can't refer to antoher sheet происходит. Исходя из этой ситуации, я подумал, что это может быть связано с неправильным написанием того, когда вы разместили вопрос.

Ссылки:

Если я неправильно понял ваш вопрос, и это был не тот результат, который вы хотите, я приношу свои извинения.

0
ответ дан Tanaike 27 February 2019 в 14:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: