簡體   English   中英

"如何在 Google Apps 腳本中的不同電子表格之間復制條件格式"

[英]How to copy conditional formatting between different spreadsheets in Google Apps Script

我有多個標題為:星期一、星期二、星期三、星期四、星期五和星期六的電子表格。 每個電子表格都有 3 張表,標題為:Plan、Class 和 Coach。 每個電子表格都有幾乎相同的格式,唯一的區別是“Plan!”的第一列和最后 8 列中合並單元格的高度。

我不斷更改電子表格中的值,因此雖然每個電子表格的格式相同,但值卻大不相同。 我也不想將所有工作表合並到一個電子表格中,因為我將有近 20 個選項卡可以瀏覽,這使得它非常混亂和耗時。

我遇到的問題是當我需要更改每張紙上的某些內容時。 我的工作表需要是我可以根據我的需要全年更新和更改的東西,並且正如您所料,必須打開每張單獨的工作表並在每個工作表中更改相同的內容可能會非常煩人。 我發現 IMPORTRANGE 函數在保持我的標題行和其他常量在工作表之間更新方面非常有用,但是我還沒有找到一種方法來使用條件格式,這是最煩人的必須更改的事情。

我在每張紙上都有多個條件格式規則,我真的需要一種方法來讓每張紙在我更改或添加規則時自動更新,比如“星期一”。

  • 我只想復制條件格式規則。<\/li>
  • 每當我更新“星期一”的條件格式規則時,我都需要更新每張工作表<\/li><\/ul>

    這是我寫的:

    當我運行我的代碼時,我收到一條錯誤消息,指出“異常:目標范圍和源范圍必須在同一個電子表格上。(第 14 行,文件'代碼')”

    現在,我不知道我想要做的事情是否真的可行,但我希望有一些解決方法可以解決我想要做的事情。 我的代碼經驗很少,但我開始了解更多(感謝 Stack Overflow 這個偉大的社區!)。 我將不勝感激您能給我的任何幫助。

解決方案:

  • 雖然 Tanaike 的解決方案可能有效,但我在這里提出了一個更直接的方法。

  • 以下解決方案使用ConditionalFormatRuleBuilder類:

     function copyConditional(){ var target = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Plan"); var source = SpreadsheetApp.openById("1RJVmCimFh24NbAlENJvH5pT3zRq_KLJmFdEWqUN_Fo8").getSheetByName("Plan"); var rules = source.getConditionalFormatRules(); target.setConditionalFormatRules(rules); }

限制:

  • 這種方法將源工作表 Plan 的所有條件格式規則復制到目標工作表 Plan 中,可能不是您要查找的內容。
  • 但是,如果您沒有在工作表中使用多個條件格式規則,此解決方案可能仍然適用於您。

替代方法:

為了復制特定范圍的條件格式,您需要使用ConditionalFormatRule類來獲取應用條件格式規則的范圍。 因為,我無權訪問您的工作表並且無法自己測試它,所以我無法確定您使用了多少種不同的條件格式規則以及在哪些范圍內。 作為起點,這是一個包含所有規則的數組以及這些規則在源工作表中應用的范圍:

var rules = source.getConditionalFormatRules();

然后遍歷范圍以准確找到哪些范圍包含哪些規則:

var rule = source.getConditionalFormatRules()[0];
var ranges = rule.getRanges();
for (int i = 0; i < ranges.length; i++) {
  Logger.log(ranges[i].getA1Notation());
}

替代解決方案:

根據后者,您可以確定要復制到目標文件的規則,而不是復制所有規則。 例如,如果范圍是I3:AN59則將條件格式規則復制到目標工作表:

function copyConditional(){

var target = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Plan");
var source = SpreadsheetApp.openById("1RJVmCimFh24NbAlENJvH5pT3zRq_KLJmFdEWqUN_Fo8").getSheetByName("Plan");

var rules = source.getConditionalFormatRules();

for (let i = 0 ; i < rules.length; i++){

var ranges = rules[i].getRanges();
for (let j = 0; j < ranges.length; j++) {
  if(ranges[j].getA1Notation() == 'I3:AN59'){
   target.setConditionalFormatRules([rules[i]]);
 }
}
}
}

此方法假設I3:AN59的條件格式規則相同。

希望我的回答對你有幫助。

這里只是一個想法:我知道您不想要一張帶有一百萬個標簽的工作表,但您可以通過菜單和一些非常基本的代碼來處理它。

在每個工作表名稱前加上日期縮寫或數字(例如 3 表示星期三)。

編寫一些代碼以顯示相關日期並隱藏其他所有內容

使用 onOpen 函數顯示今天的選項卡並隱藏其他所有內容。

還有一大堆菜單選項來顯示特定的一天。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM