「このアプリはブロックされます」の解決方法

4,442 views
Skip to first unread message

hashiku

unread,
Nov 15, 2021, 8:26:28 PM11/15/21
to Google Apps API Japan
お世話になります。

下記内容について、解決のヒントをいただきたく存じます。
お力添えいただけますと幸いです。

不明瞭な箇所等ございましたら、お気軽にご質問ください。

何卒よろしくお願いいたします。

▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁  実現したいこと ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
・Googleドライブの特定のフォルダに保存されたGoogleドキュメントのタイトルとIDを、Googleスプレッドシートでリスト表示する(シートを開くたびに自動更新)。
・リスト表示したドキュメントに順番に数字を付与し、付与した数字順にドキュメントを結合し、新しいドキュメントとしてGoogleドライブへ保存する。
・ドキュメントを結合する際、メモ書きを除外する。

▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁  実装方法 ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
1. A列にドキュメントタイトル、B列にドキュメントID、C列に結合順を記述するためのGoogleスプレッドシートを用意。
2. Google Apps Script に、本文下部にあるコードを記述。
3. open 関数に、ファイルを開いたときに起動するトリガーを設定。
4. 操作対象のGoogleドライブのフォルダIDを、コードへ記述。

▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁  経緯 ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
私は現在、 Google Apps Script を利用した案件を受注しております。
お客様のGoogleアカウント上で、上記の動作を実現したいと考えております。

しかし私のアカウントでは正常に動作するものの、
お客様のアカウントでは正常に動作せず、ご質問に至りました。

▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁  現況 ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
・私は Google Workspace と通常の2アカウントを所持しており、どちらも正常に動作確認済。
・お客様の組織未所属の通常のアカウントでは、トリガー設定時に下記エラーが発生。
・ログイン中のGoogleアカウントに、操作対象のGoogleドライブおよびファイルへのアクセス権限があることを確認済。
・「安全性の低いアプリへのアクセス」はオンで試行。
・アカウントがロックされている可能性を考慮し、先週金曜日から2日間待機し、月曜日に再試行。

▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁  備考 ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
・onOpen関数では動作が不安定だったため、open関数+トリガーを利用。

▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁  エラー ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
このアプリはブロックされます

このアプリが、Googleアカウントのプライベートな情報にアクセスしようとしました。
アカウントを安全に保つため、Googleによりこのアクセスはブロックされました。

▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁  コード ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
const driveFolderId = 'GoogleドライブのフォルダID';

const open = () => {
const ui = SpreadsheetApp.getUi();
const menu = ui.createMenu('スクリプト');
menu.addItem('ファイルをマージ', 'mergeDoc');
menu.addToUi();
const dialog = HtmlService
.createHtmlOutput('')
.setWidth(350)
.setHeight(1);

ui.showModalDialog(dialog, 'ファイルを更新中です...');

const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
const docs = getDocs();
const maxRows = sheet.getMaxRows();
// console.log(maxRows);

// 一度真っ新にしてからファイル一覧を書き込む
sheet.getRange(2, 1, maxRows - 1, 2).clearContent();
sheet.getRange(2, 1, Object.keys(docs).length, 2).setValues(docs);

// 余分な空白行を削除する
for(let i=maxRows; i>=2; i--) {
if(sheet.getRange(i, 1).isBlank()) {
sheet.deleteRow(i);
}
}

ui.showModalDialog(dialog, 'ファイルを更新しました');
}

const getDocs = () => {
const folder = DriveApp.getFolderById(driveFolderId);
const files = folder.getFiles();
const docs = [];

while (files.hasNext()) {
const file = files.next();
docs.push([file.getName(), file.getId()]);
}

return docs;
};

const mergeDoc = () => {
const sheet = SpreadsheetApp.getActiveSpreadsheet();
// スプレッドシートのC列の順に、B列のドキュメントIDを取得
const mergeFileIDS = sheet.getRange("files!B2:C").getValues().filter(data => data[1]).sort((a, b) => a[1] - b[1]).map(data => data[0]);

if(!mergeFileIDS.length) {
return;
}

// 新規ファイル作成
const newDoc = DocumentApp.create(`マージファイル_${Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyyMMddHHmmss')}`);

// マージ対象ファイルのテキストを、マージファイルに書き込み
const body = newDoc.getBody();
for(const mergeFileID of mergeFileIDS) {
const mergeFileText = DocumentApp.openById(mergeFileID).getBody().getText();
const sanitizedText = sanitizeText(mergeFileText);
body.appendParagraph(`${sanitizedText}\n`);
}
body.removeChild(body.getChild(0));

// ファイルを Google Drive へ保存
const newDocId = newDoc.getId();
const newFile = DriveApp.getFileById(newDocId);
const folder = DriveApp.getFolderById(driveFolderId)
folder.addFile(newFile);
DriveApp.getRootFolder().removeFile(newFile);
DocumentApp.openById(newDocId);
}

const sanitizeText = (text) => {
return text.replace(/\n\[memo\].*\[\/memo\]/g, '');
}
Reply all
Reply to author
Forward
0 new messages