使用 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);
}
解释:
步骤如下:
- 以
Jan-2020
, 的格式获取今天的month-year
- 获取 C 列的所有日期值,
- 保护 完整 sheet,
- 遍历 C 列的日期值:如果今天的 month-year 与日期值匹配,则取消保护该行。
结果:
只能编辑包含 Aug-2020 的行(不受保护):
我有一个 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);
}
解释:
步骤如下:
- 以
Jan-2020
, 的格式获取今天的month-year
- 获取 C 列的所有日期值,
- 保护 完整 sheet,
- 遍历 C 列的日期值:如果今天的 month-year 与日期值匹配,则取消保护该行。
结果:
只能编辑包含 Aug-2020 的行(不受保护):