您好大师/导师/老师 我现有的项目有问题。如果有人可以帮助我,我想在这里尝试
注意:时间戳记是脚本编码的
A列
下拉列表单元(尚未开始,进行中,已完成)
B列
如果同一行的A列选择“进行中”,则B列将带有时间戳记(时间开始)
C列
如果同一行的A列选择“已完成”,则C列将带有时间戳记(时间结束)
我的问题是,有时人们可能会忘记先将“进行中”放在首位,而只是继续执行“已完成”。
如果列B为空白,是否有办法限制列C的单元格?因此,如果尚无法使用“进行中”时间戳记,并且C列仅在B列不再为空时获得时间戳记,则无法继续执行“已完成”
答案 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);
安装:
我在开始日期设置了基本控件,但是您可以检查它是否是一个日期,该值是否早于现在等等。这取决于您的需要,但是此代码为您提供了实现控件的基本方法想要。
史蒂芬(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