使用 Google Apps 脚本根据列的条件使 Google 表格中的行不可编辑

Make the rows non editable in Google Sheets based on the criteria of a column using Google Apps Script

我有一个 Google sheet,它将有员工更新的历史数据。我想冻结(不可编辑)具有 1 月至 7 月(直到上个月)数据的行,并保留当前月份的行以供编辑。每行都有一个包含月份的列。任何月份为一月至七月(直到上个月)的行,应保护这些行以供编辑。我试过使用数据验证,但任何有权访问 sheet.

的人都可以将其删除

这是一个示例 sheet:https://docs.google.com/spreadsheets/d/102Rs93sZxeY2rq1WJEIL50P_6RLRzOCmDlIH6ZoBTx8/edit#gid=0

解决方案:

这就是您要查找的内容:

function protectData() {
  
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName('Sheet1');
  const today_date = new Date();
  const today_month = today_date.toLocaleString('default', { month: 'short' });
  const today_full_date = `${today_month}-${today_date.getFullYear()}`
  const months = sh.getRange('C2:C'+sh.getLastRow()).getDisplayValues().flat(1);
  const protection = sh.protect();
   
  const unprotected = [sh.getRange(sh.getLastRow()+1,1,sh.getMaxRows()-sh.getLastRow(),sh.getMaxColumns()),
                      sh.getRange(1,sh.getLastColumn()+1,sh.getMaxRows(),sh.getMaxColumns()-sh.getLastColumn())];
  
  months.forEach((month,index)=>{          
                 if(month===today_full_date)
                       {                    
                          unprotected.push(sh.getRange(index+2,1,1,sh.getLastColumn()));                                           
                       }           
                 })
    protection.setUnprotectedRanges(unprotected);                
}

解释:

步骤如下:

  1. Jan-2020,
  2. 的格式获取今天的month-year
  3. 获取 C 列的所有日期值,
  4. 保护 完整 sheet,
  5. 遍历 C 列的日期值:如果今天的 month-year 与日期值匹配,则取消保护该行。

结果:

只能编辑包含 Aug-2020 的行(不受保护):