列或单元格限制(如果其他单元格或列为空白,

时间:2019-11-14 05:26:12

标签: google-apps-script google-sheets

您好大师/导师/老师 我现有的项目有问题。如果有人可以帮助我,我想在这里尝试

注意:时间戳记是脚本编码的

A列

下拉列表单元(尚未开始,进行中,已完成)

B列

如果同一行的A列选择“进行中”,则B列将带有时间戳记(时间开始)

C列

如果同一行的A列选择“已完成”,则C列将带有时间戳记(时间结束)

我的问题是,有时人们可能会忘记先将“进行中”放在首位,而只是继续执行“已完成”。

如果列B为空白,是否有办法限制列C的单元格?因此,如果尚无法使用“进行中”时间戳记,并且C列仅在B列不再为空时获得时间戳记,则无法继续执行“已完成”

2 个答案:

答案 0 :(得分:0)

您可以做的是设置触发器onEdit,该触发器将检查用户是否有开始日期的情况下,当用户选择“完成”时。如果不是,则脚本将下拉列表还原为先前的值并显示警告消息。

要工作,必须将onEdit()设置为可安装的触发器。

它看起来像:

const boxrec = require("boxrec").Boxrec;
const fastcsv = require('fast-csv');
const fs = require('fs');
async function getCookieJar(){
    try {
        const cookieJar = await boxrec.login('**','***');
        return cookieJar;
    } catch (e) {
        console.log("Login error: " + e);
    }
};
async function writeData() {
    const csv = require('csv-parser')
    const results = [];
    fs.createReadStream('C:\\Users\\User\\Documents\\completed16.csv')
        .pipe(csv())
        .on('data',(data)=> results.push(data))
        .on('end', async () => {
          const cookieJar = await getCookieJar();
          const promises = [];
          results.forEach((data) => {
            promises.push(boxrec.getPersonById(cookieJar,data.global_id));
          })
          const fighters = await Promise.all(promises); 
          fighters.forEach((fighter) => {
              let data = '';
              for (const key in fighter.output) {
                  if (Array.isArray(fighter.output[key])) {
                      data += JSON.stringify(fighter.output[key]) + ',';
                  } else if (typeof fighter.output[key] === 'object') {
                      data += JSON.stringify(fighter.output[key]) + ',';
                  } else {
                      data += fighter.output[key] + ',';
                  }
              }
              data = data.replace(/(^,)|(,$)/g, "");
              data += '\n';

              fs.appendFile('C:\\Users\\User\\Documents\\fin16.csv',data, (err) => {
                  if (err) throw err;
              });
          });
        });
    };
try {
    writeData();
} catch (error) {
    console.log("Error in writeData: " + error);

安装:

  1. 在YOUR_SHEET_ID的位置输入工作表ID。
  2. 运行功能setupTrigger()

我在开始日期设置了基本控件,但是您可以检查它是否是一个日期,该值是否早于现在等等。这取决于您的需要,但是此代码为您提供了实现控件的基本方法想要。

史蒂芬(Stéphane)

答案 1 :(得分:0)

使用Spreadsheet Service [1]中的方法和可安装的onEdit触发器[2] [3],我设置了以下代码,如果A列中的任何单元格更改为“尚未开始”,它将保护该行中的C列单元格不被编辑(对于您之外的任何人)。如果将A列中的单元格更改为“进行中”,它将删除之前创建的保护:

function onEditFunction(e) {
  var range = e.range;
  var col = range.getColumn();
  var row = range.getRow();
  var value = e.value;

  if(col == 1) {
    if(value == "Not yet started") {
      //Protect column C in that row
      var protection = range.offset(0, 2).protect();
      protection.removeEditors(protection.getEditors());
    } 
    else if(value == "In Progress") {
      var rangeC = range.offset(0, 2);
      var sheet = range.getSheet();
      var protections = sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE);

      for (var i = 0; i < protections.length; i++) {
        var protection = protections[i];
        if (protection.getRange().getA1Notation() == rangeC.getA1Notation()) {
          protection.remove();
        }
      }  
    }
  }
}

function createSpreadsheetOnEditTrigger() {
  var ss = SpreadsheetApp.getActive();
  ScriptApp.newTrigger('onEditFunction')
      .forSpreadsheet(ss)
      .onEdit()
      .create();
}

您需要运行一次createSpreadsheetOnEditTrigger函数来创建将使用您的凭据运行的onEdit触发器。

[1] https://developers.google.com/apps-script/reference/spreadsheet

[2] https://developers.google.com/apps-script/guides/triggers/installable

[3] https://developers.google.com/apps-script/guides/triggers/events