我想获取谷歌工作表单元格中的所有评论,以将其转换为同一单元格中的注释。这里单元格中的数据不应更改。并且还应包括发表评论的人的姓名。 我使用这段代码来满足第一个要求。但这没有用。如何才能正确完成此操作?
function convertCommentsToNotes() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var range = sheet.getDataRange();
var notes = range.getNotes();
for (var i = 0; i < notes.length; i++) {
for (var j = 0; j < notes[i].length; j++) {
var note = notes[i][j];
var comment = sheet.getRange(i + 1, j + 1).getComment();
if (comment !== null) {
var commentText = comment.getRange().getValue();
note = note + "\n\n" + commentText;
}
sheet.getRange(i + 1, j + 1).setNote(note);
}
}
}
我相信您的目标如下。
现阶段,为了从电子表格中检索注释,需要使用Drive API 的注释。但是,即使从 API 检索评论,也可以获取评论文本,就像
"anchor": "{\"type\":\"workbook-range\",\"uid\":0,\"range\":\"123456789\"}"
一样。不幸的是,无法从 \"range\":\"123456789\"
得知锚定单元。
根据上述情况,我创建了一个 Google Apps 脚本库,用于从单元格中获取评论。 Ref 在这个答案中,我想提出一个修改后的脚本来反映这个库。
您可以在这里查看如何安装它。
请在高级 Google 服务中启用 Drive API。 参考
请将以下脚本复制并粘贴到电子表格的脚本编辑器中。
function convertCommentsToNotes() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const ssId = ss.getId();
const sheet = ss.getActiveSheet();
const notes = sheet.getDataRange().getNotes();
const res = DocsServiceApp.openBySpreadsheetId(ssId).getSheetByName(sheet.getSheetName()).getComments();
const obj = res.reduce((o, { range, comment }) => (o[`${range.row - 1}_${range.col - 1}`] = comment.map(e => e.comment.trim()).join("\n"), o), {});
const maxRows = sheet.getMaxRows();
const maxCols = sheet.getMaxColumns();
const newNotes = [];
for (let i = 0; i < maxRows; i++) {
const temp = [];
for (let j = 0; j < maxCols; j++) {
const note = ((notes[i] && notes[i][j]) ? notes[i][j] : "") + (obj[`${i}_${j}`] || "");
temp.push(note);
}
newNotes.push(temp);
}
sheet.getRange(1, 1, newNotes.length, newNotes[0].length).setNotes(newNotes);
// If you want to delete all comments, you can also use the following script.
// But, when you use the following script, please be careful about this, because all comments are deleted.
// const commentIds = Drive.Comments.list(ssId).items.map(({ commentId }) => commentId);
// commentIds.forEach(id => Drive.Comments.remove(ssId, id));
}
谢谢你。这非常有效。