投稿日:2026.10.05


「A4」1枚アンケート広告作成アドバイザー東京支部の比嘉と申します。
普段はホームページ制作やシステム制作などを行ってます。
中でも、WordPressを使ったホームページ構築や、販促のシステム構築などを得意としており、当「A4」1枚販促アンケート広告作成アドバイザー協会の方でも「販促アンケートPOP自動作成システム」や「オンライン広告原稿作成システム」なども制作させて頂いてます。
はじめに
以前、このブログで、
「Google DriveのAIを活用したOCR機能で手書きアンケートを簡単にテキスト化する方法」
という記事を書きました。
以前の記事はこちらです。
この記事では、紙に書いてもらった「A4」1枚アンケートをスマートフォンで撮影し、Google DriveのOCR機能を使って文字をテキスト化する方法をご紹介しました。
紙のアンケートを一文字ずつパソコンへ入力しなくても、ある程度まで自動で文字データにできます。
ただ、以前の記事では、紙のアンケートを文字データにするところまででした。
今回は、その続きをやってみたいと思います。
これまでの第3回、第4回では、Googleフォームから回答された「A4」1枚アンケートを使って、AIにタイトルや抜粋文を作ってもらったり、回答内容を分類してタグを付けたりしながら、WordPressへ自動投稿する仕組みをご紹介しました。
では、その仕組みを紙のアンケートにもつなげられないか。
今回作るのは、紙の「A4」1枚アンケートをスマートフォンで撮影し、決められたGoogle Driveのフォルダへ入れるだけで、WordPressのお客様の声を下書きまで作る仕組みです。
今回できるようになること
普段行う作業は、それほど多くありません。
紙で回収した「A4」1枚アンケートをスマートフォンで撮影して、Google Driveへ入れます。
そこから先は、次のような流れで進みます。
紙の「A4」1枚アンケート
↓
スマートフォンで撮影
↓
Google Driveの指定フォルダへ入れる
↓
Google DriveのOCRで文字を読み取る
↓
AIがQ1~Q5の回答を整理
↓
投稿タイトル・抜粋文・タグを作る
↓
WordPressへ「下書き」として保存
↓
内容を確認して公開

これまでは、Googleフォームへ入力された時点ですでに文字データになっていました。
今回は、その手前に紙に書かれた文字を読み取る処理を加えます。
今回は自動公開ではなく「下書き」にします
写真からWordPressまで自動で処理できるなら、そのまま公開までしてしまえばよいようにも思えます。
ただ、今回は下書きで止めます。
以前の記事でもご紹介しましたが、OCRで読み取った文字は100%正確とは限りません。手書き文字の形や写真の状態によって、読み間違いが起こることがあります。
たとえば、お客様が、
「問い合わせが増えました」
と書いていても、
「問い合わせが曽えました」
のように読み取ってしまう可能性があります。
こうした場合でも、OCR自体は文字を読み取ったものとして処理が進むことがあります。
ですので、
「OCRで読めた = 正しく読めた」
ではありません。
今回は、
WordPressの下書きまでは自動
↓
最後に原本と見比べる
↓
問題なければ公開
という形にします。
入力作業はできるだけ減らしながら、お客様が書いてくださった言葉の最終確認だけは人が行う、という使い方です。
Google Driveには3つのフォルダを用意します
今回の仕組みでは、Google Driveに次の3つのフォルダを作ります。
・「A4」1枚アンケート_未処理
・「A4」1枚アンケート_処理済み
・「A4」1枚アンケート_エラー
それぞれ役割があります。
「A4」1枚アンケート_未処理
スマートフォンで撮影したアンケート画像を入れる場所です。
普段使うのは、基本的にこのフォルダです。
「A4」1枚アンケート_処理済み
OCR、AIによる整理、WordPressへの下書き保存まで正常に終わったアンケートが移動します。
WordPressの下書きを確認するときは、このフォルダにある原本画像と見比べることができます。
「A4」1枚アンケート_エラー
自動処理を最後まで完了できなかったアンケートを一時的に置く場所です。
このフォルダについては、少し補足しておきます。
「エラー」フォルダには、どんなファイルが入るのか
エラーフォルダは、OCRが文字を少し読み間違えたファイルを入れる場所ではありません。
多少読み間違えていても、文字として認識され、WordPressの下書きまで作れたのであれば「処理済み」に入ります。
文字の読み間違いは、最後に人が確認して修正します。
エラーフォルダへ移動するのは、たとえば次のような場合です。
- JPEG、PNG、PDF以外のファイルが入っていた
- OCRでほとんど文字を取得できなかった
- AIとの通信に失敗した
- AIがQ5の回答を取り出せず、投稿を作れなかった
- WordPressへ接続できなかった
- WordPressのユーザー名やアプリケーションパスワードなどに問題があり、下書きを保存できなかった
途中で処理そのものが止まってしまったファイルを、一時的に避難させる場所と考えてください。
流れはこんな感じです。
未処理フォルダ
↓
自動処理
↓
最後まで完了
→ 処理済みフォルダ
途中で処理できなくなった
→ エラーフォルダ

エラーフォルダへ移ったファイルを、そのまま何度も自動処理することはしません。
原因を確認して直したあと、
「A4」1枚アンケート_未処理
へ戻せば、もう一度処理されます。
今回は「1回答=1ファイル」で処理します
今回の仕組みでは、1人分の「A4」1枚アンケートを、1つの画像または1つのPDFとして保存します。
たとえば10人分のアンケートを1つのPDFにまとめて、その中から10件のお客様の声を作るところまでは、今回は行いません。
まずは、
1人分のアンケート
↓
1ファイル
↓
WordPressの下書き1件
という形にしておきます。
ステップ1 3つのフォルダを作る
Google Driveを開いて、先ほどの3つのフォルダを作ります。
・「A4」1枚アンケート_未処理
・「A4」1枚アンケート_処理済み
・「A4」1枚アンケート_エラー
フォルダを作ったら、それぞれのフォルダIDを確認します。
Google Driveでフォルダを開くと、URLは次のような形になります。
https://drive.google.com/drive/folders/xxxxxxxxxxxxxxxxxxxx
この、
xxxxxxxxxxxxxxxxxxxx
の部分がフォルダIDです。
3つとも控えておいてください。

ステップ2 Google Apps Scriptを作る
次に、Google Apps Scriptで新しいプロジェクトを作ります。
今回は、写真やPDFをGoogleドキュメントへ変換するためにDrive APIも使います。
Apps Scriptの左側にある「サービス」の「+」から、Drive APIを追加してください。

ステップ3 今回のコードを貼り付ける
Apps Scriptへ、次のコードを貼り付けます。
少し長く見えますが、普段変更するのは最初の設定部分です。
// ==================================================
// 自分の環境に合わせて変更する部分
// ==================================================
// Google Drive
const SOURCE_FOLDER_ID = '未処理フォルダのID';
const PROCESSED_FOLDER_ID = '処理済みフォルダのID';
const ERROR_FOLDER_ID = 'エラーフォルダのID';
// WordPress
const WP_SITE_URL = 'https://example.com';
const WP_USERNAME = 'wordpress_user_name';
const WP_APP_PASSWORD = 'xxxx xxxx xxxx xxxx xxxx xxxx';
const CATEGORY_ID = 12;
// Gemini
const GEMINI_API_KEY = 'Gemini APIキー';
const GEMINI_MODEL = 'gemini-2.5-flash';
// 1回の実行で処理する最大数
const MAX_FILES_PER_RUN = 3;
// ==================================================
// タグ候補
// 第4回と同じ内容です
// ==================================================
const TAG_SETTINGS = {
concern: [
{ name: '集客', slug: 'concern-attracting-customers' },
{ name: '売上', slug: 'concern-sales' },
{ name: '費用', slug: 'concern-cost' },
{ name: '時間', slug: 'concern-time' },
{ name: '操作方法', slug: 'concern-operation' },
{ name: '品質', slug: 'concern-quality' },
{ name: '信頼', slug: 'concern-trust' },
{ name: 'その他の悩み', slug: 'concern-other' }
],
decision: [
{ name: '丁寧な対応', slug: 'decision-careful-response' },
{ name: '分かりやすい説明', slug: 'decision-clear-explanation' },
{ name: '実績', slug: 'decision-track-record' },
{ name: '価格', slug: 'decision-price' },
{ name: '対応の早さ', slug: 'decision-speed' },
{ name: '提案力', slug: 'decision-proposal' },
{ name: '専門性', slug: 'decision-expertise' },
{ name: '安心感', slug: 'decision-reassurance' },
{ name: 'その他の決め手', slug: 'decision-other' }
],
result: [
{ name: '問い合わせ改善', slug: 'result-inquiries' },
{ name: '売上向上', slug: 'result-sales' },
{ name: '時間短縮', slug: 'result-time-saving' },
{ name: '不安解消', slug: 'result-relief' },
{ name: '理解向上', slug: 'result-understanding' },
{ name: '品質向上', slug: 'result-quality' },
{ name: '満足', slug: 'result-satisfaction' },
{ name: 'その他の変化', slug: 'result-other' }
]
};
// ==================================================
// メイン処理
// ==================================================
function processNewSurveyFiles() {
const sourceFolder =
DriveApp.getFolderById(SOURCE_FOLDER_ID);
const processedFolder =
DriveApp.getFolderById(PROCESSED_FOLDER_ID);
const errorFolder =
DriveApp.getFolderById(ERROR_FOLDER_ID);
const files = sourceFolder.getFiles();
let count = 0;
while (
files.hasNext() &&
count < MAX_FILES_PER_RUN
) {
const file = files.next();
count++;
try {
// ファイル形式を確認
if (!isSupportedFile_(file)) {
throw new Error(
'対応していないファイル形式です。'
);
}
// Google DriveのOCRで文字を取得
const ocrText =
extractTextWithDriveOcr_(file);
// ほとんど文字が取れなかった場合
if (
!ocrText ||
ocrText.trim().length < 10
) {
throw new Error(
'OCRで十分な文字を取得できませんでした。'
);
}
// Geminiでアンケート内容を整理
const survey =
analyzeSurveyWithGemini_(ocrText);
// Q5が取れなければ投稿を作らない
if (!survey.q5) {
throw new Error(
'Q5の回答を確認できませんでした。'
);
}
const authToken =
createWordPressAuthToken_();
// タグを確認・作成
const tagIds =
getTagIds_(
authToken,
[
survey.concernTag,
survey.decisionTag,
survey.resultTag
]
);
// WordPressへ下書き保存
const post =
createWordPressDraft_(
authToken,
survey,
tagIds
);
// 元画像の説明欄へ
// WordPressの投稿IDを記録
file.setDescription(
'WordPress下書きID:' +
post.id
);
// 処理済みへ移動
file.moveTo(processedFolder);
Logger.log(
'処理完了:' +
file.getName()
);
} catch (error) {
Logger.log(
'処理エラー:' +
file.getName() +
' / ' +
error.message
);
// 何が原因だったかを
// ファイルの説明欄へ記録
try {
file.setDescription(
'処理エラー:' +
error.message
);
} catch (e) {
Logger.log(e.message);
}
// エラーフォルダへ移動
try {
file.moveTo(errorFolder);
} catch (e) {
Logger.log(
'エラーフォルダへ移動できませんでした:' +
e.message
);
}
}
}
}
// ==================================================
// 対応ファイルか確認
// ==================================================
function isSupportedFile_(file) {
const mimeType =
file.getMimeType();
return [
'image/jpeg',
'image/png',
'application/pdf'
].indexOf(mimeType) !== -1;
}
// ==================================================
// Google Drive OCR
// ==================================================
function extractTextWithDriveOcr_(file) {
const blob =
file.getBlob();
const metadata = {
name:
'OCR_' +
file.getName(),
mimeType:
'application/vnd.google-apps.document'
};
// 画像・PDFをGoogleドキュメントへ変換
const ocrFile =
Drive.Files.create(
metadata,
blob,
{
ocrLanguage: 'ja',
fields: 'id'
}
);
let text = '';
try {
// 変換直後は開けないことがあるので
// 少し待ちながら確認
for (let i = 0; i < 5; i++) {
Utilities.sleep(1000);
try {
const doc =
DocumentApp.openById(
ocrFile.id
);
text =
doc
.getBody()
.getText()
.trim();
if (text) {
break;
}
} catch (e) {
// 次の確認まで待つ
}
}
if (!text) {
throw new Error(
'OCRで文字を取得できませんでした。'
);
}
return text;
} finally {
// OCR用に作った
// Googleドキュメントは不要なので
// ゴミ箱へ移動
try {
DriveApp
.getFileById(ocrFile.id)
.setTrashed(true);
} catch (e) {
Logger.log(
'OCR用ファイルを削除できませんでした。'
);
}
}
}
// ==================================================
// GeminiでQ1~Q5を整理
// ==================================================
function analyzeSurveyWithGemini_(
ocrText
) {
const concernTags =
TAG_SETTINGS.concern
.map(tag => tag.name)
.join('、');
const decisionTags =
TAG_SETTINGS.decision
.map(tag => tag.name)
.join('、');
const resultTags =
TAG_SETTINGS.result
.map(tag => tag.name)
.join('、');
const prompt = `
以下は、手書きされた
「A4」1枚アンケートを
OCRで読み取った文章です。
OCRのため、
文字の読み間違いが
含まれている可能性があります。
回答に書かれていない内容を
勝手に補わないでください。
質問は次の内容です。
Q1:
購入前にどんなことで
悩んでいたか
Q2:
何で商品・サービスを
知ったか
Q3:
知ってすぐ購入したか。
購入しなかった場合は
何が不安だったか
Q4:
何が決め手となって
購入したか
Q5:
実際に利用してみて
どうだったか
OCR文章から
Q1~Q5の回答を整理してください。
また、
・Q5をもとにした30文字以内のタイトル
・短い抜粋文
・Q1の悩みタグ
・Q4の決め手タグ
・Q5の変化タグ
も作ってください。
タグは必ず
次の候補から選んでください。
購入前の悩み:
${concernTags}
購入の決め手:
${decisionTags}
購入後の変化:
${resultTags}
判断できないタグは
空文字にしてください。
推測して選ばないでください。
次のJSON形式だけで
回答してください。
{
"displayName": "",
"q1": "",
"q2": "",
"q3": "",
"q4": "",
"q5": "",
"title": "",
"excerpt": "",
"concernTag": "",
"decisionTag": "",
"resultTag": ""
}
OCR文章:
${ocrText}
`;
const url =
'https://generativelanguage.googleapis.com/' +
'v1beta/models/' +
encodeURIComponent(GEMINI_MODEL) +
':generateContent';
const response =
UrlFetchApp.fetch(
url,
{
method: 'post',
contentType:
'application/json',
headers: {
'x-goog-api-key':
GEMINI_API_KEY
},
payload:
JSON.stringify({
contents: [
{
parts: [
{
text: prompt
}
]
}
],
generationConfig: {
responseMimeType:
'application/json'
}
}),
muteHttpExceptions: true
}
);
checkResponse_(
response,
'Gemini'
);
const json =
JSON.parse(
response.getContentText()
);
if (
!json.candidates ||
!json.candidates[0] ||
!json.candidates[0].content ||
!json.candidates[0].content.parts ||
!json.candidates[0].content.parts[0]
) {
throw new Error(
'AIから回答を取得できませんでした。'
);
}
const resultText =
json
.candidates[0]
.content
.parts[0]
.text
.replace(/```json/gi, '')
.replace(/```/g, '')
.trim();
const result =
JSON.parse(resultText);
return {
displayName:
cleanText_(
result.displayName
) || '匿名',
q1:
cleanText_(result.q1),
q2:
cleanText_(result.q2),
q3:
cleanText_(result.q3),
q4:
cleanText_(result.q4),
q5:
cleanText_(result.q5),
title:
cleanText_(result.title) ||
'お客様の声',
excerpt:
cleanText_(result.excerpt),
concernTag:
validateTag_(
result.concernTag,
'concern'
),
decisionTag:
validateTag_(
result.decisionTag,
'decision'
),
resultTag:
validateTag_(
result.resultTag,
'result'
)
};
}
// ==================================================
// AIが選んだタグを確認
// ==================================================
function validateTag_(
name,
group
) {
if (!name) {
return '';
}
const allowed =
TAG_SETTINGS[group]
.map(tag => tag.name);
return allowed.indexOf(name) !== -1
? name
: '';
}
// ==================================================
// WordPressタグを確認・作成
// ==================================================
function getTagIds_(
authToken,
tagNames
) {
const ids = [];
tagNames
.filter(name => name)
.forEach(function(name) {
const tag =
findTagSetting_(name);
if (!tag) {
return;
}
const id =
getOrCreateTag_(
authToken,
tag
);
if (
id &&
ids.indexOf(id) === -1
) {
ids.push(id);
}
});
return ids;
}
function findTagSetting_(name) {
const groups =
Object.keys(TAG_SETTINGS);
for (
let i = 0;
i < groups.length;
i++
) {
const tags =
TAG_SETTINGS[groups[i]];
for (
let j = 0;
j < tags.length;
j++
) {
if (
tags[j].name === name
) {
return tags[j];
}
}
}
return null;
}
function getOrCreateTag_(
authToken,
tag
) {
const url =
WP_SITE_URL +
'/wp-json/wp/v2/tags?slug=' +
encodeURIComponent(tag.slug);
const response =
UrlFetchApp.fetch(
url,
{
headers: {
Authorization:
'Basic ' +
authToken
},
muteHttpExceptions: true
}
);
checkResponse_(
response,
'WordPressタグ確認'
);
const tags =
JSON.parse(
response.getContentText()
);
if (tags.length > 0) {
return Number(tags[0].id);
}
const createResponse =
UrlFetchApp.fetch(
WP_SITE_URL +
'/wp-json/wp/v2/tags',
{
method: 'post',
contentType:
'application/json',
headers: {
Authorization:
'Basic ' +
authToken
},
payload:
JSON.stringify({
name: tag.name,
slug: tag.slug
}),
muteHttpExceptions: true
}
);
const code =
createResponse
.getResponseCode();
const text =
createResponse
.getContentText();
if (
code >= 200 &&
code < 300
) {
return Number(
JSON.parse(text).id
);
}
try {
const error =
JSON.parse(text);
if (
error.code ===
'term_exists' &&
error.data &&
error.data.term_id
) {
return Number(
error.data.term_id
);
}
} catch (e) {
}
throw new Error(
'WordPressのタグを作成できませんでした。'
);
}
// ==================================================
// WordPressへ下書き保存
// ==================================================
function createWordPressDraft_(
authToken,
survey,
tagIds
) {
const content =
'<p>' +
escapeHtml_(survey.excerpt) +
'</p>' +
'<hr>' +
'<p><strong>' +
'〖利用後の感想〗' +
'</strong></p>' +
'<p>' +
escapeHtml_(survey.q5)
.replace(/\n/g, '<br>') +
'</p>';
const response =
UrlFetchApp.fetch(
WP_SITE_URL +
'/wp-json/wp/v2/posts',
{
method: 'post',
contentType:
'application/json',
headers: {
Authorization:
'Basic ' +
authToken
},
payload:
JSON.stringify({
title:
survey.title,
content:
content,
excerpt:
survey.excerpt,
// 今回は自動公開せず
// 下書きにする
status:
'draft',
categories:
[CATEGORY_ID],
tags:
tagIds,
// アイキャッチ画像は
// 自動設定しない
featured_media:
0
}),
muteHttpExceptions: true
}
);
checkResponse_(
response,
'WordPress下書き保存'
);
return JSON.parse(
response.getContentText()
);
}
// ==================================================
// WordPress認証
// ==================================================
function createWordPressAuthToken_() {
const password =
WP_APP_PASSWORD
.replace(/\s/g, '');
return Utilities.base64Encode(
WP_USERNAME +
':' +
password
);
}
// ==================================================
// 共通処理
// ==================================================
function checkResponse_(
response,
name
) {
const code =
response.getResponseCode();
if (
code < 200 ||
code >= 300
) {
throw new Error(
name +
'でエラーが発生しました。' +
' ステータスコード:' +
code
);
}
}
function cleanText_(text) {
if (!text) {
return '';
}
return String(text).trim();
}
function escapeHtml_(text) {
if (!text) {
return '';
}
return String(text)
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
コード内で変更する部分
自分の環境に合わせて変更するのは、主にコードの最初にある部分です。
const SOURCE_FOLDER_ID = '未処理フォルダのID';
const PROCESSED_FOLDER_ID = '処理済みフォルダのID';
const ERROR_FOLDER_ID = 'エラーフォルダのID';
const WP_SITE_URL = 'https://example.com';
const WP_USERNAME = 'wordpress_user_name';
const WP_APP_PASSWORD = 'xxxx xxxx xxxx xxxx xxxx xxxx';
const CATEGORY_ID = 12;
const GEMINI_API_KEY = 'Gemini APIキー';
const GEMINI_MODEL = 'gemini-2.5-flash';

Google Driveの3つのフォルダIDと、これまでの記事でも使ってきたWordPress、Geminiの設定を入力します。
Geminiの設定・準備については下記の記事で簡単に触れています。
https://a4kikaku.com/blog/hansoku20260705/
ステップ4 紙のアンケートを撮影する
ここは以前の記事と同じです。
紙で回答してもらった「A4」1枚アンケートをスマートフォンで撮影します。
アンケート全体が写真に入るようにして、文字ができるだけはっきり見える状態で撮影してください。
暗い場所だったり、影がかかっていたり、斜めから撮影されていると、読み取り結果にも影響します。

撮影したら、
「A4」1枚アンケート_未処理
フォルダへ入れます。
普段行う作業は、基本的にここまでです。
ステップ5 1時間ごとに自動確認するようにする
Googleフォームの場合は、回答が送信されたときに自動処理を始められました。
Google Driveの場合は、今回は一定時間ごとにフォルダを確認する方法にします。
今回は、1時間ごとに未処理フォルダを確認する設定にします。
1時間ごとに確認
↓
未処理フォルダに写真がある
↓
あれば自動処理
↓
なければ何もしない
Apps Scriptの左側にある「トリガー」を開き、「トリガーを追加」をクリックします。
設定は次のようにします。
実行する関数
processNewSurveyFiles
イベントのソース
時間主導型
時間ベースのトリガーのタイプ
時間ベースのタイマー
時間の間隔
1時間おき

これで、1時間ごとに、
「A4」1枚アンケート_未処理
フォルダを確認します。
写真がなければ何もしません。写真が入っていれば、自動処理が始まります。
もっと早く処理したい場合は、確認する間隔を短くすることもできます。
ステップ6 実際に試してみる
設定が終わったら、まずは1枚だけで試してみます。
手書きの「A4」1枚アンケートを撮影して、
「A4」1枚アンケート_未処理
へ入れてください。
次の自動確認時に処理が始まります。
正常に最後まで処理されると、画像は、
「A4」1枚アンケート_処理済み
へ移動します。
WordPressの管理画面を開くと、お客様の声が下書きとして作成されています。
下書きには、AIが作った投稿タイトル、抜粋文、Q5のお客様の感想が入ります。
第4回と同じように、Q1の購入前の悩み、Q4の購入の決め手、Q5の購入後の変化に合わせたタグも設定されます。
タグは、すでにWordPressにあるものはそのまま使い、なければ自動で作成します。
「処理済み」だから文章も正しい、ではありません
ここは少し注意が必要です。
画像が「処理済み」フォルダへ入ったということは、OCRからWordPressの下書き保存まで、システム上は最後まで処理できたということです。
OCRで一文字も間違えずに読み取れた、という意味ではありません。
WordPressの下書きを開いたら、処理済みフォルダにある元のアンケート画像と見比べてみてください。
特に、お客様の声として掲載するQ5は確認しておいた方がよいと思います。
読み間違いがあれば、WordPress上で修正します。
問題がなければ、そのまま公開します。
エラーフォルダに入った場合
自動処理の途中で問題が起きた場合は、画像が、
「A4」1枚アンケート_エラー
へ移動します。
画像の説明欄には、
「処理エラー:○○○○」
という形で、分かる範囲で原因を記録するようにしています。
たとえば、
「処理エラー:対応していないファイル形式です。」
や、
「処理エラー:WordPress下書き保存でエラーが発生しました。」
といった形です。
原因が分かったら設定やファイルを修正して、もう一度、
「A4」1枚アンケート_未処理
へ戻します。
すると、その後の自動確認時にもう一度処理されます。
エラーになったものまで1時間ごとに何度も処理するのではなく、一度エラーフォルダへ移して、人が確認してから戻す形にしています。
この方が、何か問題が起きたときにも状況を追いやすいと思います。
今回できたこと
今回の仕組みでは、人が普段行う作業は、
紙のアンケートを回収
↓
スマートフォンで撮影
↓
Google Driveへ入れる
ところまでです。
そのあとは、
1時間ごとに未処理フォルダを確認
↓
OCRで文字を読み取る
↓
AIがQ1~Q5を整理
↓
投稿タイトルを作る
↓
抜粋文を作る
↓
タグを付ける
↓
WordPressへ下書き保存
↓
元画像を処理済みへ移動
という流れで処理します。
途中で最後まで処理できなかった場合は、エラーフォルダへ移動します。

最後に行うのは、原本とWordPressの下書きを見比べて、問題がなければ公開する作業です。
紙の「A4」1枚アンケートでも自動化できる
これまでの連載では、Googleフォームのように、最初からデジタルデータになっている「A4」1枚アンケートを中心に自動投稿の仕組みを作ってきました。
ただ、「A4」1枚アンケートは紙に手書きしてもらう場面も多いと思います。
紙で集めること自体をやめる必要はありません。
紙で集めたあとに行っていた、
アンケートを見ながら入力
↓
文章を整える
↓
WordPressへ貼り付ける
↓
タグを設定する
という作業を減らせます。
以前の記事では、紙を文字データにするところまででした。
今回は、その先のWordPressのお客様の声の下書きまでつなげてみました。
以前の記事を試していただいた方にも、その続きを試していただければと思います。
まとめ
今回は、手書きの「A4」1枚アンケートをスマートフォンで撮影し、Google Driveの決められたフォルダへ入れることで、WordPressのお客様の声を下書き保存する仕組みをご紹介しました。
Google Driveには、
未処理
処理済み
エラー
の3つのフォルダを用意します。
通常は1時間ごとに未処理フォルダを確認して、新しいアンケートがあれば処理します。
正常に最後まで処理できたものは「処理済み」へ、途中でシステム上の問題が起きたものは「エラー」へ移動します。
OCRの読み間違いは、システム側で必ず判別できるわけではありません。ですので、WordPressの下書きと元のアンケートを最後に人が確認します。
全部を自動にするのではなく、入力や転記に使っていた作業を減らして、最後の確認だけ人が行う形です。
紙で集めた「A4」1枚アンケートでも、写真を入口にすれば、これまで作ってきたAIやWordPressの仕組みにつなげられます。
自分では設定が難しい方は、設定のお手伝いも可能です。お気軽にご相談ください。
※ご案内※
◆新刊発売記念|客単価アップ大事典「つい買ってしまう」販促の仕掛け75|限定プレゼント

◆毎月 販促成功事例が届くメルマガ

📮 メルマガ登録で「A4」1枚アンケート通信が毎月届きます!
ブログを読んで「もっと事例を知りたい」「他の人はどう広告に活かしてるの?」と思った方へ。
メルマガに登録すると、毎月1回【成功事例】をまとめた
『「A4」1枚アンケート通信』があなたの元に届きます📩
登録は無料です♪ぜひお気軽にご登録ください😊













浅野 雅義
振本 一
比嘉 正敏
金子 綾
神南 臣之輔
小宮 康義
桑原 聖志
大見 和志
大澤 正
佐々木 こづえ
寺戸 守
豊平 尚哉
綿井 彩織
佐々木 渉
山田 修史 











