「A4」1枚販促アンケート広告作成アドバイザー協会

  • お問い合わせはこちら
  • 24時間以内に
    ご返信いたします
    *土日祝は除く
メニューを開く

第6回:手書きの「A4」1枚アンケートも「お客様の声」として自動化!写真をGoogle Driveに入れるだけでWordPressに下書き保存する方法

投稿日: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, '&amp;')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/"/g, '&quot;')
    .replace(/'/g, '&#039;');
}

コード内で変更する部分

自分の環境に合わせて変更するのは、主にコードの最初にある部分です。

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枚アンケート通信』があなたの元に届きます📩

登録は無料です♪ぜひお気軽にご登録ください😊

  • 全国の開催日程を確認をする
  • 広告作成アドバイザーの派遣を依頼する
  • 近くの広告作成アドバイザーを探す
  • 認定資格の取得を目指す

お問い合わせ窓口

ページTOPに戻る

©2017 「A4」1枚販促アンケート広告作成アドバイザー協会

お問い合わせ窓口